static uint32_t murmur_hash_process2a(const char *key, uint32_t length, uint32_t seed) { const uint32_t m = MURMURHASH_MAGIC; const uint8_t r = 24; uint32_t h, k, t, l; const unsigned char *data = (const unsigned char *) key; l = length; h = seed; while (4 <= length) { k = *(uint32_t*)data; mmix(h,k); data += 4; length -= 4; } t = 0; switch (length) { case 3: t ^= data[2] << 16; case 2: t ^= data[1] << 8; case 1: t ^= data[0]; } mmix(h,t); mmix(h,l); h ^= h >> 13; h *= m; h ^= h >> 15; return h; }
unsigned int End ( void ) { mmix(m_hash,m_tail); mmix(m_hash,m_size); m_hash ^= m_hash >> 13; m_hash *= m; m_hash ^= m_hash >> 15; return m_hash; }
unsigned int MurmurHash2A ( const void * key, int len, unsigned int seed ) { const unsigned int m = 0x5bd1e995; const int r = 24; unsigned int l = len; const unsigned char * data = (const unsigned char *)key; unsigned int h = seed; while(len >= 4) { unsigned int k = *(unsigned int*)data; mmix(h,k); data += 4; len -= 4; } unsigned int t = 0; switch(len) { case 3: t ^= data[2] << 16; case 2: t ^= data[1] << 8; case 1: t ^= data[0]; }; mmix(h,t); mmix(h,l); h ^= h >> 13; h *= m; h ^= h >> 15; return h; }
void Add ( const unsigned char * data, int len ) { m_size += len; MixTail(data,len); while(len >= 4) { unsigned int k = *(unsigned int*)data; mmix(m_hash,k); data += 4; len -= 4; } MixTail(data,len); }