89 const uint8_t* data = (
const uint8_t*)key;
90 const int nblocks = len / 16;
97 const uint32_t c1 = 0x239b961b;
98 const uint32_t c2 = 0xab0e9789;
99 const uint32_t c3 = 0x38b34ae5;
100 const uint32_t c4 = 0xa1e38b93;
104 const uint32_t* blocks = (
const uint32_t*)(data + nblocks * 16);
106 for (
int i = -nblocks; i; i++) {
119 h1 = h1 * 5 + 0x561ccd1b;
128 h2 = h2 * 5 + 0x0bcaa747;
137 h3 = h3 * 5 + 0x96cd1c35;
146 h4 = h4 * 5 + 0x32ac3b17;
151 const uint8_t* tail = (
const uint8_t*)(data + nblocks * 16);
160 k4 ^= tail[14] << 16;
171 k3 ^= tail[11] << 24;
173 k3 ^= tail[10] << 16;
236 ((uint32_t*)out)[0] = h1;
237 ((uint32_t*)out)[1] = h2;
238 ((uint32_t*)out)[2] = h3;
239 ((uint32_t*)out)[3] = h4;
243 const uint8_t* data = (
const uint8_t*)key;
244 const int nblocks = len / 16;
249 const uint64_t c1 = 0x87c37b91114253d5LLU;
250 const uint64_t c2 = 0x4cf5ad432745937fLLU;
254 const uint64_t* blocks = (
const uint64_t*)(data);
256 for (
int i = 0; i < nblocks; i++) {
267 h1 = h1 * 5 + 0x52dce729;
276 h2 = h2 * 5 + 0x38495ab5;
281 const uint8_t* tail = (
const uint8_t*)(data + nblocks * 16);
288 k2 ^= ((uint64_t)tail[14]) << 48;
290 k2 ^= ((uint64_t)tail[13]) << 40;
292 k2 ^= ((uint64_t)tail[12]) << 32;
294 k2 ^= ((uint64_t)tail[11]) << 24;
296 k2 ^= ((uint64_t)tail[10]) << 16;
298 k2 ^= ((uint64_t)tail[9]) << 8;
300 k2 ^= ((uint64_t)tail[8]) << 0;
307 k1 ^= ((uint64_t)tail[7]) << 56;
309 k1 ^= ((uint64_t)tail[6]) << 48;
311 k1 ^= ((uint64_t)tail[5]) << 40;
313 k1 ^= ((uint64_t)tail[4]) << 32;
315 k1 ^= ((uint64_t)tail[3]) << 24;
317 k1 ^= ((uint64_t)tail[2]) << 16;
319 k1 ^= ((uint64_t)tail[1]) << 8;
321 k1 ^= ((uint64_t)tail[0]) << 0;
342 ((uint64_t*)out)[0] = h1;
343 ((uint64_t*)out)[1] = h2;
FORCE_INLINE uint32_t derive_c_rotl32(uint32_t x, int8_t r)
MurmurHash3 implementation, copied (with love) from Austin Appleby's implementation