15 #include "gu_byteswap.h"
26 static GU_FORCE_INLINE uint32_t _mmh3_fmix32 (uint32_t h)
37 static GU_FORCE_INLINE uint64_t _mmh3_fmix64 (uint64_t k)
40 k *= GU_ULONG_LONG(0xff51afd7ed558ccd);
42 k *= GU_ULONG_LONG(0xc4ceb9fe1a85ec53);
50 static uint32_t
const _mmh3_32_c1 = 0xcc9e2d51;
51 static uint32_t
const _mmh3_32_c2 = 0x1b873593;
53 static GU_FORCE_INLINE
void
54 _mmh3_block_32 (uint32_t k1, uint32_t* h1)
57 k1 = GU_ROTL32(k1,15);
61 *h1 = GU_ROTL32(*h1,13);
66 static GU_FORCE_INLINE
void
67 _mmh3_blocks_32 (
const uint32_t*
const blocks,
size_t const nblocks,uint32_t* h1)
73 for (i = 0; i < nblocks; i++)
78 _mmh3_block_32 (gu_le32(blocks[i]), h1);
82 static GU_FORCE_INLINE uint32_t
83 _mmh3_tail_32 (
const uint8_t*
const tail,
size_t const len, uint32_t h1)
93 case 3: k1 ^= tail[2] << 16;
94 case 2: k1 ^= tail[1] << 8;
95 case 1: k1 ^= tail[0];
97 k1 *= _mmh3_32_c1; k1 = GU_ROTL32(k1,15); k1 *= _mmh3_32_c2; h1 ^= k1;
100 size_t const shift = (len & 3) << 3;
103 uint32_t k1 = gu_le32(((uint32_t*)tail)[0]) & (0x00ffffff>>(24-shift));
104 k1 *= _mmh3_32_c1; k1 = GU_ROTL32(k1,15); k1 *= _mmh3_32_c2; h1 ^= k1;
112 h1 = _mmh3_fmix32(h1);
117 static GU_FORCE_INLINE uint32_t
118 _mmh32_seed (
const void* key,
size_t const len, uint32_t seed)
120 size_t const nblocks = len >> 2;
121 const uint32_t*
const blocks = (
const uint32_t*)key;
122 const uint8_t*
const tail = (
const uint8_t*)(blocks + nblocks);
124 _mmh3_blocks_32 (blocks, nblocks, &seed);
126 return _mmh3_tail_32 (tail, len, seed);
130 static uint32_t
const GU_MMH32_SEED = GU_ULONG(2166136261);
133 #define gu_mmh32(_buf, _len) \
134 _mmh32_seed (_buf, _len, GU_MMH32_SEED);
139 static uint64_t
const _mmh3_128_c1 = GU_ULONG_LONG(0x87c37b91114253d5);
140 static uint64_t
const _mmh3_128_c2 = GU_ULONG_LONG(0x4cf5ad432745937f);
142 static GU_FORCE_INLINE
void
143 _mmh3_128_block (uint64_t k1, uint64_t k2, uint64_t* h1, uint64_t* h2)
145 k1 *= _mmh3_128_c1; k1 = GU_ROTL64(k1,31); k1 *= _mmh3_128_c2; *h1 ^= k1;
147 *h1 = GU_ROTL64(*h1,27); *h1 += *h2; *h1 *= 5; *h1 += 0x52dce729;
149 k2 *= _mmh3_128_c2; k2 = GU_ROTL64(k2,33); k2 *= _mmh3_128_c1; *h2 ^= k2;
151 *h2 = GU_ROTL64(*h2,31); *h2 += *h1; *h2 *= 5; *h2 += 0x38495ab5;
154 static GU_FORCE_INLINE
void
155 _mmh3_128_blocks (
const uint64_t*
const blocks,
size_t const nblocks,
156 uint64_t* h1, uint64_t* h2)
162 for(i = 0; i < nblocks; i++)
167 uint64_t k1 = gu_le64(blocks[i]);
169 uint64_t k2 = gu_le64(blocks[i]);
171 _mmh3_128_block (k1, k2, h1, h2);
175 static GU_FORCE_INLINE
void
176 _mmh3_128_tail (
const uint8_t*
const tail,
size_t const len,
177 uint64_t h1, uint64_t h2, uint64_t*
const out)
187 case 15: k2 ^= ((uint64_t)tail[14]) << 48;
188 case 14: k2 ^= ((uint64_t)tail[13]) << 40;
189 case 13: k2 ^= ((uint64_t)tail[12]) << 32;
190 case 12: k2 ^= ((uint64_t)tail[11]) << 24;
191 case 11: k2 ^= ((uint64_t)tail[10]) << 16;
192 case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
193 case 9: k2 ^= ((uint64_t)tail[ 8]) << 0;
194 k2 *= _mmh3_128_c2; k2 = GU_ROTL64(k2,33); k2 *= _mmh3_128_c1; h2 ^= k2;
195 k1 = gu_le64(((uint64_t*)tail)[0]);
196 k1 *= _mmh3_128_c1; k1 = GU_ROTL64(k1,31); k1 *= _mmh3_128_c2; h1 ^= k1;
198 case 8: k1 ^= ((uint64_t)tail[ 7]) << 56;
199 case 7: k1 ^= ((uint64_t)tail[ 6]) << 48;
200 case 6: k1 ^= ((uint64_t)tail[ 5]) << 40;
201 case 5: k1 ^= ((uint64_t)tail[ 4]) << 32;
202 case 4: k1 ^= ((uint64_t)tail[ 3]) << 24;
203 case 3: k1 ^= ((uint64_t)tail[ 2]) << 16;
204 case 2: k1 ^= ((uint64_t)tail[ 1]) << 8;
205 case 1: k1 ^= ((uint64_t)tail[ 0]) << 0;
206 k1 *= _mmh3_128_c1; k1 = GU_ROTL64(k1,31); k1 *= _mmh3_128_c2; h1 ^= k1;
212 h1 ^= len; h2 ^= len;
217 h1 = _mmh3_fmix64(h1);
218 h2 = _mmh3_fmix64(h2);
227 static GU_FORCE_INLINE
void
228 _mmh3_128_seed (
const void*
const key,
size_t const len,
229 uint64_t s1, uint64_t s2, uint64_t*
const out)
231 size_t const nblocks = (len >> 4) << 1;
232 const uint64_t*
const blocks = (
const uint64_t*)(key);
233 const uint8_t*
const tail = (
const uint8_t*)(blocks + nblocks);
235 _mmh3_128_blocks (blocks, nblocks, &s1, &s2);
236 _mmh3_128_tail (tail, len, s1, s2, out);
240 static uint64_t
const GU_MMH128_SEED1 = GU_ULONG_LONG(0x6C62272E07BB0142);
241 static uint64_t
const GU_MMH128_SEED2 = GU_ULONG_LONG(0x62B821756295C58D);
244 static GU_FORCE_INLINE
void
245 gu_mmh128 (
const void*
const msg,
size_t const len,
void*
const out)
247 _mmh3_128_seed (msg, len, GU_MMH128_SEED1, GU_MMH128_SEED2, (uint64_t*)out);
248 uint64_t*
const res = (uint64_t*)out;
249 res[0] = gu_le64(res[0]);
250 res[1] = gu_le64(res[1]);
254 static GU_FORCE_INLINE uint64_t
255 gu_mmh128_64 (
const void*
const msg,
size_t len)
258 _mmh3_128_seed (msg, len, GU_MMH128_SEED1, GU_MMH128_SEED2, res);
263 static GU_FORCE_INLINE uint32_t
264 gu_mmh128_32 (
const void*
const msg,
size_t len)
267 _mmh3_128_seed (msg, len, GU_MMH128_SEED1, GU_MMH128_SEED2, res);
268 return (uint32_t)res[0];
286 static GU_INLINE
void
291 memset (mmh, 0,
sizeof(*mmh));
297 #define gu_mmh128_init(_mmh) \
298 _mmh128_init_seed (_mmh, GU_MMH128_SEED1, GU_MMH128_SEED2);
301 static GU_INLINE
void
306 size_t tail_len = mmh->length & 15;
312 size_t const to_fill = 16 - tail_len;
313 void*
const tail_end = (uint8_t*)mmh->tail + tail_len;
317 memcpy (tail_end, part, to_fill);
318 _mmh3_128_block (gu_le64(mmh->tail[0]), gu_le64(mmh->tail[1]),
319 &mmh->hash[0], &mmh->hash[1]);
320 part = ((
char*)part) + to_fill;
325 memcpy (tail_end, part, len);
330 size_t const nblocks = (len >> 4) << 1;
331 const uint64_t*
const blocks = (
const uint64_t*)(part);
333 _mmh3_128_blocks (blocks, nblocks, &mmh->hash[0], &mmh->hash[1]);
336 memcpy (mmh->tail, blocks + nblocks, len & 15);
340 static GU_INLINE
void
343 uint64_t*
const r = (uint64_t*)res;
344 _mmh3_128_tail ((
const uint8_t*)mmh->tail, mmh->length,
345 mmh->hash[0], mmh->hash[1], r);
346 r[0] = gu_le64(r[0]);
347 r[1] = gu_le64(r[1]);
350 static GU_INLINE uint64_t
354 _mmh3_128_tail ((
const uint8_t*)mmh->tail, mmh->length,
355 mmh->hash[0], mmh->hash[1], res);
359 static GU_INLINE uint32_t
363 _mmh3_128_tail ((
const uint8_t*)mmh->tail, mmh->length,
364 mmh->hash[0], mmh->hash[1], res);
365 return (uint32_t)res[0];
372 gu_mmh3_32 (
const void* key,
int len, uint32_t seed,
void* out);
376 gu_mmh3_x86_128 (
const void* key,
int len, uint32_t seed,
void* out);
380 gu_mmh3_x64_128 (
const void* key,
int len, uint32_t seed,
void* out);
Definition: gu_mmh3.h:276