.. include:: replace.txt .. highlight:: cpp Hash Functions ---------------- |ns3| provides a generic interface to general purpose hash functions. In the simplest usage, the hash function returns the 32-bit or 64-bit hash of a data buffer or string. The default underlying hash function is murmur3_, chosen because it has good hash function properties and offers a 64-bit version. The venerable FNV1a_ hash is also available. There is a straight-forward mechanism to add (or provide at run time) alternative hash function implementations. .. _murmur3: http://code.google.com/p/smhasher/wiki/MurmurHash3 .. _FNV1a: http://isthe.com/chongo/tech/comp/fnv/ Basic Usage *********** The simplest way to get a hash value of a data buffer or string is just .. sourcecode:: cpp #include "ns3/hash.h" using namespace ns3; char* buffer = ...; size_t buffer_size = ...; uint32_t buffer_hash = Hash32(buffer, buffer_size); std::string s; uint32_t string_hash = Hash32(s); Equivalent functions are defined for 64-bit hash values. Incremental Hashing ******************* In some situations it's useful to compute the hash of multiple buffers, as if they had been joined together. (For example, you might want the hash of a packet stream, but not want to assemble a single buffer with the combined contents of all the packets.) This is almost as straight-forward as the first example .. sourcecode:: cpp #include "ns3/hash.h" using namespace ns3; char* buffer; size_t buffer_size; Hasher hasher; // Use default hash function for () { buffer = get_next_buffer(); hasher(buffer, buffer_size); } uint32_t combined_hash = hasher.GetHash32(); By default ``Hasher`` preserves internal state to enable incremental hashing. If you want to reuse a ``Hasher`` object (for example because it's configured with a non-default hash function), but don't want to add to the previously computed hash, you need to ``clear()`` first .. sourcecode:: cpp hasher.clear().GetHash32(buffer, buffer_size); This reinitializes the internal state before hashing the buffer. Using an Alternative Hash Function ********************************** The default hash function is murmur3_. FNV1a_ is also available. To specify the hash function explicitly, use this constructor .. sourcecode:: cpp Hasher hasher = Hasher(Create()); Adding New Hash Function Implementations **************************************** To add the hash function ``foo``, follow the ``hash-murmur3.h``/``.cc`` pattern: * Create a class declaration (``.h``) and definition (``.cc``) inheriting from ``Hash::Implementation``. * ``include`` the declaration in ``hash.h`` (at the point where ``hash-murmur3.h`` is included. * In your own code, instantiate a ``Hasher`` object via the constructor ``Hasher(Ptr())`` If your hash function is a single function, e.g. ``hashf``, you don't even need to create a new class derived from HashImplementation .. sourcecode:: cpp Hasher hasher = Hasher(Create(&hashf)); For this to compile, your ``hashf`` has to match one of the function pointer signatures .. sourcecode:: cpp typedef uint32_t (*Hash32Function_ptr) (const char*, const size_t); typedef uint64_t (*Hash64Function_ptr) (const char*, const size_t); Sources for Hash Functions ************************** Sources for other hash function implementations include: * Peter Kankowski: http://www.strchr.com * Arash Partow: http://www.partow.net/programming/hashfunctions/index.html * SMHasher: http://code.google.com/p/smhasher/ * Sanmayce: http://www.sanmayce.com/Fastest_Hash/index.html