X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libmemcached%2Fmurmur_hash.c;h=ce28ec389cd08a571dd144e21bea3e9479817c13;hb=01de4afa83a6f906eb666ff23a0888fbb5f4005f;hp=abb2deda3e5340f68cc04e7dc4b6dd8f4da8b930;hpb=8fce86636639afaeac4ca0e869e8bcd833324a62;p=m6w6%2Flibmemcached diff --git a/libmemcached/murmur_hash.c b/libmemcached/murmur_hash.c index abb2deda..ce28ec38 100644 --- a/libmemcached/murmur_hash.c +++ b/libmemcached/murmur_hash.c @@ -2,47 +2,42 @@ /* "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; while(length >= 4) { - h += *(unsigned int *)key; - h *= m; - h ^= h >> r; + uint32_t k = *(uint32_t*)key; + MIX(h,k,m); key += 4; length -= 4; } - switch(length) + if (length) { - case 3: - h += key[2] << 16; - case 2: - h += key[1] << 8; - case 1: - default: - h += key[0]; - h *= m; - h ^= h >> r; - }; - -#ifdef MURMUR_POSTMIX + uint32_t k= 0; + + switch(length) + { + case 3: k += key[2] << 16; + case 2: k += key[1] << 8; + case 1: k += key[0]; + }; + MIX(h,k,m); + } h *= m; h ^= h >> 10; h *= m; h ^= h >> 17; -#endif - return h; }