leveldb
中的哈希函數(shù)采用的是MurMurHash
的一種變體(=.=不知道這種變體比原版優(yōu)勢在哪捉撮,如果有大佬知道导俘,球指導(dǎo)一下)榄审。
這種哈希是一種高效低碰撞的非加密型哈希函數(shù)考婴,相對于MD5/SHA1
贩虾,其開銷低,hadoop/memcached之類都在用沥阱。
小伙伴們要是自己需要實現(xiàn)哈希函數(shù)缎罢,不妨參考一下leveldb
中的實現(xiàn)
源碼
uint32_t Hash(const char* data, size_t n, uint32_t seed) {
// Similar to murmur hash
const uint32_t m = 0xc6a4a793;
const uint32_t r = 24;
const char* limit = data + n;
uint32_t h = seed ^ (n * m);
// Pick up four bytes at a time
while (data + 4 <= limit) {
uint32_t w = DecodeFixed32(data);
data += 4;
h += w;
h *= m;
h ^= (h >> 16);
}
// Pick up remaining bytes
switch (limit - data) {
case 3:
h += static_cast<unsigned char>(data[2]) << 16;
FALLTHROUGH_INTENDED;
case 2:
h += static_cast<unsigned char>(data[1]) << 8;
FALLTHROUGH_INTENDED;
case 1:
h += static_cast<unsigned char>(data[0]);
h *= m;
h ^= (h >> r);
break;
}
return h;
}