//======= Copyright © Valve Corporation, All rights reserved. ================= // // Public domain MurmurHash3 by Austin Appleby is a very solid general-purpose // hash with a 32-bit output. References: // http://code.google.com/p/smhasher/ (home of MurmurHash3) // https://sites.google.com/site/murmurhash/avalanche // http://www.strchr.com/hash_functions // //============================================================================= #ifndef MURMURHASH3_H #define MURMURHASH3_H #if defined(_WIN32) #pragma once #endif uint32 MurmurHash3_32( const void *key, size_t len, uint32 seed, bool bCaselessStringVariant = false ); inline uint32 MurmurHash3String( const char *pszKey, size_t len ) { return MurmurHash3_32( pszKey, len, 1047 /*anything will do for a seed*/, false ); } inline uint32 MurmurHash3StringCaseless( const char *pszKey, size_t len ) { return MurmurHash3_32( pszKey, len, 1047 /*anything will do for a seed*/, true ); } inline uint32 MurmurHash3String( const char *pszKey ) { return MurmurHash3String( pszKey, strlen( pszKey ) ); } inline uint32 MurmurHash3StringCaseless( const char *pszKey ) { return MurmurHash3StringCaseless( pszKey, strlen( pszKey ) ); } template inline uint32 MurmurHash3Item( const T &item ) { return MurmurHash3_32( &item, sizeof(item), 1047 ); } inline uint32 MurmurHash3Int( uint32 h ) { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } template <> inline uint32 MurmurHash3Item( const uint32 &item ) { return MurmurHash3Int( item ); } template <> inline uint32 MurmurHash3Item( const int32 &item ) { return MurmurHash3Int( item ); } template struct MurmurHash3Functor { typedef uint32 TargetType; TargetType operator()(const T &key) const { return MurmurHash3Item( key ); } }; template<> struct MurmurHash3Functor { typedef uint32 TargetType; TargetType operator()(const char *key) const { return MurmurHash3String( key ); } }; template<> struct MurmurHash3Functor { typedef uint32 TargetType; TargetType operator()(const char *key) const { return MurmurHash3String( key ); } }; #endif // MURMURHASH3_H