首页 > 代码库 > Nginx源码完全注释(6)core/murmurhash

Nginx源码完全注释(6)core/murmurhash

下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个。

uint32_t MurmurHash2 ( const void * key, int len, uint32_t seed ){  // ‘m‘ and ‘r‘ are mixing constants generated offline.  // They‘re not really ‘magic‘, they just happen to work well.  const uint32_t m = 0x5bd1e995;  const int r = 24;  // Initialize the hash to a ‘random‘ value  uint32_t h = seed ^ len;  // Mix 4 bytes at a time into the hash  const unsigned char * data = http://www.mamicode.com/(const unsigned char *)key;  while(len >= 4)  {    uint32_t k = *(uint32_t*)data;    k *= m;    k ^= k >> r;    k *= m;    h *= m;    h ^= k;    data += 4;    len -= 4;  }  // Handle the last few bytes of the input array  switch(len)  {  case 3: h ^= data[2] << 16;  case 2: h ^= data[1] << 8;  case 1: h ^= data[0];      h *= m;  };  // Do a few final mixes of the hash to ensure the last few  // bytes are well-incorporated.  h ^= h >> 13;  h *= m;  h ^= h >> 15;  return h;} 

下面是 Nginx 中 Murmurhash 的源码,基本与上面无异。

uint32_tngx_murmur_hash2(u_char *data, size_t len){    uint32_t  h, k;    h = 0 ^ len;    while (len >= 4) {        k  = data[0];        k |= data[1] << 8;        k |= data[2] << 16;        k |= data[3] << 24;        k *= 0x5bd1e995;        k ^= k >> 24;        k *= 0x5bd1e995;        h *= 0x5bd1e995;        h ^= k;        data += 4;        len -= 4;    }    switch (len) {    case 3:        h ^= data[2] << 16;    case 2:        h ^= data[1] << 8;    case 1:        h ^= data[0];        h *= 0x5bd1e995;    }    h ^= h >> 13;    h *= 0x5bd1e995;    h ^= h >> 15;    return h;}

Reference

  1. Murmurhash2

Nginx源码完全注释(6)core/murmurhash