summaryrefslogtreecommitdiffstats
path: root/src/hash_map.h
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2012-01-12 19:16:51 (GMT)
committerEvan Martin <martine@danga.com>2012-01-12 19:16:51 (GMT)
commit4f2c734821acfa5cbba93d2bf9fa204f4767ce61 (patch)
tree97d2789d38f84b4fe50f553e070ed059eada5767 /src/hash_map.h
parent292c0d42d0953a6f4d2e3a8a37426ae18355c759 (diff)
downloadNinja-4f2c734821acfa5cbba93d2bf9fa204f4767ce61.zip
Ninja-4f2c734821acfa5cbba93d2bf9fa204f4767ce61.tar.gz
Ninja-4f2c734821acfa5cbba93d2bf9fa204f4767ce61.tar.bz2
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.
Diffstat (limited to 'src/hash_map.h')
-rw-r--r--src/hash_map.h22
1 files 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 <hash_map>
@@ -69,7 +55,7 @@ using stdext::hash_compare;
struct StringPieceCmp : public hash_compare<StringPiece> {
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<std::string> {
template<>
struct hash<StringPiece> {
size_t operator()(StringPiece key) const {
- return MurmurHash2(key.str_, key.len_, kSeed);
+ return MurmurHash2(key.str_, key.len_);
}
};