52 {
53 const uint8_t* data = (const uint8_t*)key; const int nblocks = len / 16;
54 uint64_t h1 = seed, h2 = seed;
55 const uint64_t c1 = 0x87c37b91114253d5ULL, c2 = 0x4cf5ad432745937fULL;
56 const uint64_t* blocks = (const uint64_t*)(data);
57 for(int i = 0; i < nblocks; i++){
58 uint64_t k1 = blocks[i*2+0]; uint64_t k2 = blocks[i*2+1];
59 k1 *= c1; k1 =
rotl64(k1,31); k1 *= c2; h1 ^= k1; h1 =
rotl64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;
60 k2 *= c2; k2 =
rotl64(k2,33); k2 *= c1; h2 ^= k2; h2 =
rotl64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;
61 }
62 const uint8_t* tail = (const uint8_t*)(data + nblocks*16);
63 uint64_t k1 = 0, k2 = 0;
64 switch(len & 15){
65 case 15: k2 ^= ((uint64_t)tail[14]) << 48; [[fallthrough]];
66 case 14: k2 ^= ((uint64_t)tail[13]) << 40; [[fallthrough]];
67 case 13: k2 ^= ((uint64_t)tail[12]) << 32; [[fallthrough]];
68 case 12: k2 ^= ((uint64_t)tail[11]) << 24; [[fallthrough]];
69 case 11: k2 ^= ((uint64_t)tail[10]) << 16; [[fallthrough]];
70 case 10: k2 ^= ((uint64_t)tail[9]) << 8; [[fallthrough]];
71 case 9: k2 ^= ((uint64_t)tail[8]) << 0; k2 *= c2; k2 =
rotl64(k2,33); k2 *= c1; h2 ^= k2; [[fallthrough]];
72 case 8: k1 ^= ((uint64_t)tail[7]) << 56; [[fallthrough]];
73 case 7: k1 ^= ((uint64_t)tail[6]) << 48; [[fallthrough]];
74 case 6: k1 ^= ((uint64_t)tail[5]) << 40; [[fallthrough]];
75 case 5: k1 ^= ((uint64_t)tail[4]) << 32; [[fallthrough]];
76 case 4: k1 ^= ((uint64_t)tail[3]) << 24; [[fallthrough]];
77 case 3: k1 ^= ((uint64_t)tail[2]) << 16; [[fallthrough]];
78 case 2: k1 ^= ((uint64_t)tail[1]) << 8; [[fallthrough]];
79 case 1: k1 ^= ((uint64_t)tail[0]) << 0; k1 *= c1; k1 =
rotl64(k1,31); k1 *= c2; h1 ^= k1; [[fallthrough]];
80 default: break;
81 }
82 h1 ^= len; h2 ^= len; h1 += h2; h2 += h1; h1 =
fmix64(h1); h2 =
fmix64(h2); h1 += h2;
83 return h1;
84}
static uint64_t rotl64(uint64_t x, int8_t r)
static uint64_t fmix64(uint64_t k)