// See the file "COPYING" in the main distribution directory for copyright. #pragma once #include "util.h" // for bro_int_t #include #define UHASH_KEY_SIZE 36 class BroString; 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();