src/MurmurHash.cc
// 1. It will not work incrementally.
// 2. It will not produce the same results on little-endian and big-endian
//    machines.
1. It will not work incrementally.
2. It will not produce the same results on little-endian and big-endian
machines.
1 . It will not work incrementally . 2 . It will not produce the same results on little - endian and big - endian machines .
uint32_t MurmurHash2(const void * key, size_t len, uint32_t seed) {
#define m 0x5bd1e995
#define r 24
  uint32_t h = seed ^ len;
  const unsigned char * data = (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;
  }
  switch (len) {
    case 3:
      h ^= data[2] << 16;
    case 2:
      h ^= data[1] << 8;
    case 1:
      h ^= data[0];
      h *= m;
  };
  h ^= h >> 13;
  h *= m;
  h ^= h >> 15;
  return h;
}
uint32_t MurmurHash2 ( const void * key , size_t len , uint32_t seed ) { #define m  0x5bd1e995 #define r  24 uint32_t h = seed ^ len ; const unsigned char * data = ( 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 ; } switch ( len ) { case 3 : h ^= data [ 2 ] << 16 ; case 2 : h ^= data [ 1 ] << 8 ; case 1 : h ^= data [ 0 ] ; h *= m ; } ; h ^= h >> 13 ; h *= m ; h ^= h >> 15 ; return h ; }
1
1 .
// 'm' and 'r' are mixing constants generated offline. // They're not really 'magic', they just happen to work well. // Initialize the hash to a 'random' value // Mix 4 bytes at a time into the hash // Handle the last few bytes of the input array // Do a few final mixes of the hash to ensure the last few // bytes are well-incorporated.