//----------------------------------------------------------------------------- // MurmurHash2, 64-bit versions, by Austin Appleby // 64-bit hash for 64-bit big endian platforms // This variant is adapted by Luc Laforets to be incorporated into ISA. #include "MurmurHash2ISA.h" #define mmix(h,k) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; } uint64_t MurmurHashISA(const void * key, int len, uint64_t seed) { //const uint64_t m = BIG_CONSTANT(0xc6a4a7935bd1e995); const uint64_t m = 0xc6a4a7935bd1e995; const int r = 47; uint64_t l = len; uint64_t h = seed ^ (len * m); const uint64_t * data = (const uint64_t *)key; const uint64_t * end = data + (len / 8); while (data != end) { uint64_t k = *data++; k *= m; k ^= k >> r; k *= m; h ^= k; h *= m; } const unsigned char * data2 = (const unsigned char*)data; uint64_t t = 0; switch (len & 7) { case 7: t ^= ((uint64_t)(data2[6])) << 48; case 6: t ^= ((uint64_t)(data2[5])) << 40; case 5: t ^= ((uint64_t)(data2[4])) << 32; case 4: t ^= ((uint64_t)(data2[3])) << 24; case 3: t ^= ((uint64_t)(data2[2])) << 16; case 2: t ^= ((uint64_t)(data2[1])) << 8; case 1: t ^= ((uint64_t)(data2[0])); t *= m; }; mmix(h, t); mmix(h, l); h ^= h >> r; h *= m; h ^= h >> r; return h; }