From 4f2c734821acfa5cbba93d2bf9fa204f4767ce61 Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Thu, 12 Jan 2012 11:16:51 -0800 Subject: decide on murmur hash, delete stl hash A nice thing about working on Google: a C++ expert who happened to be writing a proposal on hashing for the next C++ version wandered into my office. He seemed to think using Murmur here is fine. --- src/hash_map.h | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/hash_map.h b/src/hash_map.h index d3e9c51..88c2681 100644 --- a/src/hash_map.h +++ b/src/hash_map.h @@ -17,24 +17,21 @@ #include "string_piece.h" -static const unsigned int kSeed = 0xDECAFBAD; // MurmurHash2, by Austin Appleby static inline -unsigned int MurmurHash2(const void* key, int len, unsigned int seed) { +unsigned int MurmurHash2(const void* key, int len) { + static const unsigned int seed = 0xDECAFBAD; const unsigned int m = 0x5bd1e995; const int r = 24; unsigned int h = seed ^ len; const unsigned char * data = (const unsigned char *)key; while(len >= 4) { unsigned int k = *(unsigned int *)data; - k *= m; k ^= k >> r; k *= m; - h *= m; h ^= k; - data += 4; len -= 4; } @@ -44,23 +41,12 @@ unsigned int MurmurHash2(const void* key, int len, unsigned int seed) { case 1: h ^= data[0]; h *= m; }; - h ^= h >> 13; h *= m; h ^= h >> 15; - return h; } -static inline size_t StlHash(StringPiece str) { - const char* p = str.str_; - int len = str.len_; - size_t hash = 0; - while (len--) - hash = 5 * hash + *p++; - return hash; -} - #ifdef _MSC_VER #include @@ -69,7 +55,7 @@ using stdext::hash_compare; struct StringPieceCmp : public hash_compare { size_t operator()(const StringPiece& key) const { - return MurmurHash2(key.str_, key.len_, kSeed); + return MurmurHash2(key.str_, key.len_); } bool operator()(const StringPiece& a, const StringPiece& b) const { int cmp = strncmp(a.str_, b.str_, min(a.len_, b.len_)); @@ -100,7 +86,7 @@ struct hash { template<> struct hash { size_t operator()(StringPiece key) const { - return MurmurHash2(key.str_, key.len_, kSeed); + return MurmurHash2(key.str_, key.len_); } }; -- cgit v0.12