X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmurmur_hash.c;h=7cfcaa9eba087559de5c2d371f85bec615c6c460;hb=8f4f53d570ffa167f08912242c1a41d6f314ac0b;hp=abb2deda3e5340f68cc04e7dc4b6dd8f4da8b930;hpb=34a8c3858f30b02568c87f56a827f618aba6d6be;p=awesomized%2Flibmemcached diff --git a/libmemcached/murmur_hash.c b/libmemcached/murmur_hash.c index abb2deda..7cfcaa9e 100644 --- a/libmemcached/murmur_hash.c +++ b/libmemcached/murmur_hash.c @@ -2,21 +2,21 @@ /* "Murmur"hash provided by Austin, tanjent@gmail.com -#define MURMUR_POSTMIX */ +#define MIX(h,k,m) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; } + uint32_t murmur_hash(char *key, size_t length) { - const unsigned int m= 0x7fd652ad; + const uint32_t m= 0x5bd1e995; const int r= 16; - - uint32_t h= 0xdeadbeef; + uint32_t h= length * m; + uint32_t k = 0; while(length >= 4) { - h += *(unsigned int *)key; - h *= m; - h ^= h >> r; + k = *(uint32_t*)key; + MIX(h,k,m); key += 4; length -= 4; @@ -24,25 +24,16 @@ uint32_t murmur_hash(char *key, size_t length) switch(length) { - case 3: - h += key[2] << 16; - case 2: - h += key[1] << 8; - case 1: - default: - h += key[0]; - h *= m; - h ^= h >> r; + case 3: k += key[2] << 16; + case 2: k += key[1] << 8; + case 1: k += key[0]; + MIX(h,k,m); }; -#ifdef MURMUR_POSTMIX - h *= m; h ^= h >> 10; h *= m; h ^= h >> 17; -#endif - return h; }