| 258 | //----------------------------------------------------------------------------- |
| 259 | |
| 260 | void MurmurHash3_x64_128 ( const void * key, const int len, |
| 261 | const uint32_t seed, void * out ) |
| 262 | { |
| 263 | const uint8_t * data = (const uint8_t*)key; |
| 264 | const int nblocks = len / 16; |
| 265 | |
| 266 | uint64_t h1 = seed; |
| 267 | uint64_t h2 = seed; |
| 268 | |
| 269 | const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); |
| 270 | const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); |
| 271 | |
| 272 | //---------- |
| 273 | // body |
| 274 | |
| 275 | const uint64_t * blocks = (const uint64_t *)(data); |
| 276 | |
| 277 | for(int i = 0; i < nblocks; i++) |
| 278 | { |
| 279 | uint64_t k1 = getblock(blocks,i*2+0); |
| 280 | uint64_t k2 = getblock(blocks,i*2+1); |
| 281 | |
| 282 | k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; |
| 283 | |
| 284 | h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; |
| 285 | |
| 286 | k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; |
| 287 | |
| 288 | h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; |
| 289 | } |
| 290 | |
| 291 | //---------- |
| 292 | // tail |
| 293 | |
| 294 | const uint8_t * tail = (const uint8_t*)(data + nblocks*16); |
| 295 | |
| 296 | uint64_t k1 = 0; |
| 297 | uint64_t k2 = 0; |
| 298 | |
| 299 | switch(len & 15) |
| 300 | { |
| 301 | case 15: k2 ^= uint64_t(tail[14]) << 48; |
| 302 | case 14: k2 ^= uint64_t(tail[13]) << 40; |
| 303 | case 13: k2 ^= uint64_t(tail[12]) << 32; |
| 304 | case 12: k2 ^= uint64_t(tail[11]) << 24; |
| 305 | case 11: k2 ^= uint64_t(tail[10]) << 16; |
| 306 | case 10: k2 ^= uint64_t(tail[ 9]) << 8; |
| 307 | case 9: k2 ^= uint64_t(tail[ 8]) << 0; |
| 308 | k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; |
| 309 | |
| 310 | case 8: k1 ^= uint64_t(tail[ 7]) << 56; |
| 311 | case 7: k1 ^= uint64_t(tail[ 6]) << 48; |
| 312 | case 6: k1 ^= uint64_t(tail[ 5]) << 40; |
| 313 | case 5: k1 ^= uint64_t(tail[ 4]) << 32; |
| 314 | case 4: k1 ^= uint64_t(tail[ 3]) << 24; |
| 315 | case 3: k1 ^= uint64_t(tail[ 2]) << 16; |
| 316 | case 2: k1 ^= uint64_t(tail[ 1]) << 8; |
| 317 | case 1: k1 ^= uint64_t(tail[ 0]) << 0; |
no test coverage detected