18 memcpy(&out, p + ((ptrdiff_t)i * 4),
sizeof(out));
24 memcpy(&out, p + ((ptrdiff_t)i * 8),
sizeof(out));
40 k *= 0xff51afd7ed558ccdLLU;
42 k *= 0xc4ceb9fe1a85ec53LLU;
50 const uint8_t*
data = (
const uint8_t*)key;
51 const int32_t nblocks = len / 4;
55 const uint32_t c1 = 0xcc9e2d51;
56 const uint32_t c2 = 0x1b873593;
60 const uint8_t* blocks =
data + (ptrdiff_t)(nblocks * 4);
62 for (
int i = -nblocks; i; i++) {
71 h1 = h1 * 5 + 0xe6546b64;
76 const uint8_t* tail = (
const uint8_t*)(
data + (ptrdiff_t)(nblocks * 4));
82 k1 ^= ((uint32_t)tail[2]) << 16;
85 k1 ^= ((uint32_t)tail[1]) << 8;
88 k1 ^= ((uint32_t)tail[0]);
103 *(uint32_t*)out = h1;
107 uint32_t seed,
void* out) {
108 const uint8_t*
data = (
const uint8_t*)key;
109 const int32_t nblocks = len / 16;
116 const uint32_t c1 = 0x239b961b;
117 const uint32_t c2 = 0xab0e9789;
118 const uint32_t c3 = 0x38b34ae5;
119 const uint32_t c4 = 0xa1e38b93;
123 const uint8_t* blocks =
data + (ptrdiff_t)(nblocks * 16);
125 for (
int i = -nblocks; i; i++) {
138 h1 = h1 * 5 + 0x561ccd1b;
147 h2 = h2 * 5 + 0x0bcaa747;
156 h3 = h3 * 5 + 0x96cd1c35;
165 h4 = h4 * 5 + 0x32ac3b17;
170 const uint8_t* tail = (
const uint8_t*)(
data + (ptrdiff_t)(nblocks * 16));
179 k4 ^= ((uint32_t)tail[14]) << 16;
182 k4 ^= ((uint32_t)tail[13]) << 8;
185 k4 ^= ((uint32_t)tail[12]) << 0;
193 k3 ^= ((uint32_t)tail[11]) << 24;
196 k3 ^= ((uint32_t)tail[10]) << 16;
199 k3 ^= ((uint32_t)tail[9]) << 8;
202 k3 ^= ((uint32_t)tail[8]) << 0;
210 k2 ^= ((uint32_t)tail[7]) << 24;
213 k2 ^= ((uint32_t)tail[6]) << 16;
216 k2 ^= ((uint32_t)tail[5]) << 8;
219 k2 ^= ((uint32_t)tail[4]) << 0;
227 k1 ^= ((uint32_t)tail[3]) << 24;
230 k1 ^= ((uint32_t)tail[2]) << 16;
233 k1 ^= ((uint32_t)tail[1]) << 8;
236 k1 ^= ((uint32_t)tail[0]) << 0;
271 ((uint32_t*)out)[0] = h1;
272 ((uint32_t*)out)[1] = h2;
273 ((uint32_t*)out)[2] = h3;
274 ((uint32_t*)out)[3] = h4;
278 const uint32_t seed,
void* out) {
279 const uint8_t*
data = (
const uint8_t*)key;
280 const int32_t nblocks = len / 16;
285 const uint64_t c1 = 0x87c37b91114253d5LLU;
286 const uint64_t c2 = 0x4cf5ad432745937fLLU;
290 const uint8_t* blocks =
data;
292 for (int32_t i = 0; i < nblocks; i++) {
303 h1 = h1 * 5 + 0x52dce729;
312 h2 = h2 * 5 + 0x38495ab5;
317 const uint8_t* tail = (
const uint8_t*)(
data + (ptrdiff_t)(nblocks * 16));
324 k2 ^= ((uint64_t)tail[14]) << 48;
327 k2 ^= ((uint64_t)tail[13]) << 40;
330 k2 ^= ((uint64_t)tail[12]) << 32;
333 k2 ^= ((uint64_t)tail[11]) << 24;
336 k2 ^= ((uint64_t)tail[10]) << 16;
339 k2 ^= ((uint64_t)tail[9]) << 8;
342 k2 ^= ((uint64_t)tail[8]) << 0;
350 k1 ^= ((uint64_t)tail[7]) << 56;
353 k1 ^= ((uint64_t)tail[6]) << 48;
356 k1 ^= ((uint64_t)tail[5]) << 40;
359 k1 ^= ((uint64_t)tail[4]) << 32;
362 k1 ^= ((uint64_t)tail[3]) << 24;
365 k1 ^= ((uint64_t)tail[2]) << 16;
368 k1 ^= ((uint64_t)tail[1]) << 8;
371 k1 ^= ((uint64_t)tail[0]) << 0;
394 ((uint64_t*)out)[0] = h1;
395 ((uint64_t*)out)[1] = h2;
399#if SIZE_MAX == UINT64_MAX
403 return (
size_t)out128[0];
404#elif SIZE_MAX == UINT32_MAX
408 return (
size_t)out32;
410 #error "Unsupported size_t width"
418#define MURMURHASH_3_FMIx64(type, ...) \
419 DC_PUBLIC static size_t type##_hash_murmurhash3(type const* key) { \
420 DC_STATIC_ASSERT(sizeof(type) <= sizeof(uint64_t), \
421 "MurmurHash3 only supports up to 64-bit integers"); \
422 return (size_t)PRIV(murmur_fmix64)((uint64_t)(*key)); \
427#undef MURMURHASH_3_FMIx64
430#define STRING_SIZES(_apply) \
441#define MURMURHASH_DEFAULT_SEED 0x9747b28c
443#define MURMURHASH_STRING_FIXED_SIZE(size) \
444 DC_PUBLIC static size_t dc_murmur_hash_string_##size(const char str[size]) { \
445 return dc_murmurhash(str, size, MURMURHASH_DEFAULT_SEED); \
454#undef MURMURHASH_STRING_FIXED_SIZE
455#undef MURMURHASH_DEFAULT_SEED
static DC_PUBLIC ITEM * data(SELF *self)
DC_INLINE uint32_t PRIV murmur_getblock32(const uint8_t *p, int32_t i)
static DC_PUBLIC void dc_MurmurHash3_x86_128(const void *key, const int32_t len, uint32_t seed, void *out)
DC_INLINE uint32_t PRIV murmur_fmix32(uint32_t h)
static DC_PUBLIC size_t dc_murmur_hash_string(const char *str)
static DC_PUBLIC void dc_MurmurHash3_x86_32(const void *key, int32_t len, uint32_t seed, void *out)
#define MURMURHASH_STRING_FIXED_SIZE(size)
#define MURMURHASH_DEFAULT_SEED
#define STRING_SIZES(_apply)
static DC_PUBLIC size_t dc_murmurhash(const void *key, int32_t len, uint32_t seed)
#define MURMURHASH_3_FMIx64(type,...)
DC_INLINE uint64_t PRIV murmur_getblock64(const uint8_t *p, int32_t i)
static DC_PUBLIC void dc_MurmurHash3_x64_128(const void *key, const int32_t len, const uint32_t seed, void *out)
DC_INLINE uint32_t PRIV murmur_rotl32(uint32_t x, int8_t r)
MurmurHash3 implementation, copied (with love) from Austin Appleby's implementation.
DC_INLINE uint64_t PRIV murmur_rotl64(uint64_t x, int8_t r)
DC_INLINE uint64_t PRIV murmur_fmix64(uint64_t k)
#define DC_INT_REFLECT(F,...)