37 const uint8_t* data = (
const uint8_t*)key;
38 const int32_t nblocks = len / 4;
42 const uint32_t c1 = 0xcc9e2d51;
43 const uint32_t c2 = 0x1b873593;
47 const uint32_t* blocks = (
const uint32_t*)(data + (ptrdiff_t)(nblocks * 4));
49 for (
int i = -nblocks; i; i++) {
58 h1 = h1 * 5 + 0xe6546b64;
63 const uint8_t* tail = (
const uint8_t*)(data + (ptrdiff_t)(nblocks * 4));
91 const uint8_t* data = (
const uint8_t*)key;
92 const int32_t nblocks = len / 16;
99 const uint32_t c1 = 0x239b961b;
100 const uint32_t c2 = 0xab0e9789;
101 const uint32_t c3 = 0x38b34ae5;
102 const uint32_t c4 = 0xa1e38b93;
106 const uint32_t* blocks = (
const uint32_t*)(data + (ptrdiff_t)(nblocks * 16));
108 for (
int i = -nblocks; i; i++) {
121 h1 = h1 * 5 + 0x561ccd1b;
130 h2 = h2 * 5 + 0x0bcaa747;
139 h3 = h3 * 5 + 0x96cd1c35;
148 h4 = h4 * 5 + 0x32ac3b17;
153 const uint8_t* tail = (
const uint8_t*)(data + (ptrdiff_t)(nblocks * 16));
162 k4 ^= tail[14] << 16;
173 k3 ^= tail[11] << 24;
175 k3 ^= tail[10] << 16;
239 ((uint32_t*)out)[0] = h1;
240 ((uint32_t*)out)[1] = h2;
241 ((uint32_t*)out)[2] = h3;
242 ((uint32_t*)out)[3] = h4;
247 const uint8_t* data = (
const uint8_t*)key;
248 const int32_t nblocks = len / 16;
253 const uint64_t c1 = 0x87c37b91114253d5LLU;
254 const uint64_t c2 = 0x4cf5ad432745937fLLU;
258 const uint64_t* blocks = (
const uint64_t*)(data);
260 for (int32_t i = 0; i < nblocks; i++) {
271 h1 = h1 * 5 + 0x52dce729;
280 h2 = h2 * 5 + 0x38495ab5;
285 const uint8_t* tail = (
const uint8_t*)(data + (ptrdiff_t)(nblocks * 16));
292 k2 ^= ((uint64_t)tail[14]) << 48;
294 k2 ^= ((uint64_t)tail[13]) << 40;
296 k2 ^= ((uint64_t)tail[12]) << 32;
298 k2 ^= ((uint64_t)tail[11]) << 24;
300 k2 ^= ((uint64_t)tail[10]) << 16;
302 k2 ^= ((uint64_t)tail[9]) << 8;
304 k2 ^= ((uint64_t)tail[8]) << 0;
311 k1 ^= ((uint64_t)tail[7]) << 56;
313 k1 ^= ((uint64_t)tail[6]) << 48;
315 k1 ^= ((uint64_t)tail[5]) << 40;
317 k1 ^= ((uint64_t)tail[4]) << 32;
319 k1 ^= ((uint64_t)tail[3]) << 24;
321 k1 ^= ((uint64_t)tail[2]) << 16;
323 k1 ^= ((uint64_t)tail[1]) << 8;
325 k1 ^= ((uint64_t)tail[0]) << 0;
347 ((uint64_t*)out)[0] = h1;
348 ((uint64_t*)out)[1] = h2;
352#if SIZE_MAX == UINT64_MAX
356 return (
size_t)out128[0];
357#elif SIZE_MAX == UINT32_MAX
360 MurmurHash3_x86_32(key, len, seed, &out32);
361 return (
size_t)out32;
363#error "Unsupported size_t width"
FORCE_INLINE uint32_t derive_c_rotl32(uint32_t x, int8_t r)
MurmurHash3 implementation, copied (with love) from Austin Appleby's implementation