zeek/src/Hash.h
2019-09-17 14:10:30 +02:00

87 lines
2.3 KiB
C++

// See the file "COPYING" in the main distribution directory for copyright.
#pragma once
#include <stdlib.h>
#include "BroString.h"
#define UHASH_KEY_SIZE 36
typedef uint64_t hash_t;
typedef enum {
HASH_KEY_INT,
HASH_KEY_DOUBLE,
HASH_KEY_STRING
#define NUM_HASH_KEYS (int(HASH_KEY_STRING) + 1)
} HashKeyTag;
class HashKey {
public:
explicit HashKey(bro_int_t i);
explicit HashKey(bro_uint_t u);
explicit HashKey(uint32_t u);
HashKey(const uint32_t u[], int n);
explicit HashKey(double d);
explicit HashKey(const void* p);
explicit HashKey(const char* s);
explicit HashKey(const BroString* s);
~HashKey()
{
if ( is_our_dynamic )
delete [] (char *) key;
}
// Create a HashKey given all of its components. "key" is assumed
// to be dynamically allocated and to now belong to this HashKey
// (to delete upon destruct'ing). If "copy_key" is true, it's
// first copied.
//
// The calling sequence here is unusual (normally key would be
// first) to avoid possible ambiguities with the next constructor,
// which is the more commonly used one.
HashKey(int copy_key, void* key, int size);
// Same, but automatically copies the key.
HashKey(const void* key, int size, hash_t hash);
// Builds a key from the given chunk of bytes.
HashKey(const void* bytes, int size);
// Create a Hashkey given all of its components *without*
// copying the key and *without* taking ownership. Note that
// "dont_copy" is a type placeholder to differentiate this member
// function from the one above; its value is not used.
HashKey(const void* key, int size, hash_t hash, bool dont_copy);
// Hands over the key to the caller. This means that if the
// key is our dynamic, we give it to the caller and mark it
// as not our dynamic. If initially it's not our dynamic,
// we give them a copy of it.
void* TakeKey();
const void* Key() const { return key; }
int Size() const { return size; }
hash_t Hash() const { return hash; }
unsigned int MemoryAllocation() const { return padded_sizeof(*this) + pad_size(size); }
static hash_t HashBytes(const void* bytes, int size);
protected:
void* CopyKey(const void* key, int size) const;
union {
bro_int_t i;
uint32_t u32;
double d;
const void* p;
} key_u;
void* key;
int is_our_dynamic;
int size;
hash_t hash;
};
extern void init_hash_function();