7#include <machine/endian.h>
45#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
93 a -= c; a ^= rot(c, 4); c += b; \
94 b -= a; b ^= rot(a, 6); a += c; \
95 c -= b; c ^= rot(b, 8); b += a; \
96 a -= c; a ^= rot(c,16); c += b; \
97 b -= a; b ^= rot(a,19); a += c; \
98 c -= b; c ^= rot(b, 4); b += a; \
126#define final(a,b,c) \
128 c ^= b; c -= rot(b,14); \
129 a ^= c; a -= rot(c,11); \
130 b ^= a; b -= rot(a,25); \
131 c ^= b; c -= rot(b,16); \
132 a ^= c; a -= rot(c,4); \
133 b ^= a; b -= rot(a,14); \
134 c ^= b; c -= rot(b,24); \
158 a = b =
c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
185#if BYTE_ORDER == LITTLE_ENDIAN
213uint32_t
jenkins_hash(
const void *key,
size_t length, uint32_t initval)
216 union {
const void *ptr;
size_t i; } u;
219 a = b =
c = 0xdeadbeef + ((uint32_t)length) + initval;
222 if ((u.i & 0x3) == 0) {
223 const uint32_t *k = (
const uint32_t *)key;
249 case 12:
c+=k[2]; b+=k[1]; a+=k[0];
break;
250 case 11:
c+=k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
251 case 10:
c+=k[2]&0xffff; b+=k[1]; a+=k[0];
break;
252 case 9 :
c+=k[2]&0xff; b+=k[1]; a+=k[0];
break;
253 case 8 : b+=k[1]; a+=k[0];
break;
254 case 7 : b+=k[1]&0xffffff; a+=k[0];
break;
255 case 6 : b+=k[1]&0xffff; a+=k[0];
break;
256 case 5 : b+=k[1]&0xff; a+=k[0];
break;
257 case 4 : a+=k[0];
break;
258 case 3 : a+=k[0]&0xffffff;
break;
259 case 2 : a+=k[0]&0xffff;
break;
260 case 1 : a+=k[0]&0xff;
break;
264 }
else if ((u.i & 0x1) == 0) {
265 const uint16_t *k = (
const uint16_t *)key;
271 a += k[0] + (((uint32_t)k[1])<<16);
272 b += k[2] + (((uint32_t)k[3])<<16);
273 c += k[4] + (((uint32_t)k[5])<<16);
280 k8 = (
const uint8_t *)k;
283 case 12:
c+=k[4]+(((uint32_t)k[5])<<16);
284 b+=k[2]+(((uint32_t)k[3])<<16);
285 a+=k[0]+(((uint32_t)k[1])<<16);
287 case 11:
c+=((uint32_t)k8[10])<<16;
289 b+=k[2]+(((uint32_t)k[3])<<16);
290 a+=k[0]+(((uint32_t)k[1])<<16);
293 case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
294 a+=k[0]+(((uint32_t)k[1])<<16);
296 case 7 : b+=((uint32_t)k8[6])<<16;
298 a+=k[0]+(((uint32_t)k[1])<<16);
301 case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
303 case 3 : a+=((uint32_t)k8[2])<<16;
312 const uint8_t *k = (
const uint8_t *)key;
318 a += ((uint32_t)k[1])<<8;
319 a += ((uint32_t)k[2])<<16;
320 a += ((uint32_t)k[3])<<24;
322 b += ((uint32_t)k[5])<<8;
323 b += ((uint32_t)k[6])<<16;
324 b += ((uint32_t)k[7])<<24;
326 c += ((uint32_t)k[9])<<8;
327 c += ((uint32_t)k[10])<<16;
328 c += ((uint32_t)k[11])<<24;
337 case 12:
c+=((uint32_t)k[11])<<24;
338 case 11:
c+=((uint32_t)k[10])<<16;
339 case 10:
c+=((uint32_t)k[9])<<8;
341 case 8 : b+=((uint32_t)k[7])<<24;
342 case 7 : b+=((uint32_t)k[6])<<16;
343 case 6 : b+=((uint32_t)k[5])<<8;
345 case 4 : a+=((uint32_t)k[3])<<24;
346 case 3 : a+=((uint32_t)k[2])<<16;
347 case 2 : a+=((uint32_t)k[1])<<8;
366uint32_t
jenkins_hash(
const void *key,
size_t length, uint32_t initval)
369 union {
const void *ptr;
size_t i; } u;
372 a = b =
c = 0xdeadbeef + ((uint32_t)length) + initval;
375 if ((u.i & 0x3) == 0) {
376 const uint32_t *k = (
const uint32_t *)key;
402 case 12:
c+=k[2]; b+=k[1]; a+=k[0];
break;
403 case 11:
c+=k[2]&0xffffff00; b+=k[1]; a+=k[0];
break;
404 case 10:
c+=k[2]&0xffff0000; b+=k[1]; a+=k[0];
break;
405 case 9 :
c+=k[2]&0xff000000; b+=k[1]; a+=k[0];
break;
406 case 8 : b+=k[1]; a+=k[0];
break;
407 case 7 : b+=k[1]&0xffffff00; a+=k[0];
break;
408 case 6 : b+=k[1]&0xffff0000; a+=k[0];
break;
409 case 5 : b+=k[1]&0xff000000; a+=k[0];
break;
410 case 4 : a+=k[0];
break;
411 case 3 : a+=k[0]&0xffffff00;
break;
412 case 2 : a+=k[0]&0xffff0000;
break;
413 case 1 : a+=k[0]&0xff000000;
break;
418 const uint8_t *k = (
const uint8_t *)key;
423 a += ((uint32_t)k[0])<<24;
424 a += ((uint32_t)k[1])<<16;
425 a += ((uint32_t)k[2])<<8;
426 a += ((uint32_t)k[3]);
427 b += ((uint32_t)k[4])<<24;
428 b += ((uint32_t)k[5])<<16;
429 b += ((uint32_t)k[6])<<8;
430 b += ((uint32_t)k[7]);
431 c += ((uint32_t)k[8])<<24;
432 c += ((uint32_t)k[9])<<16;
433 c += ((uint32_t)k[10])<<8;
434 c += ((uint32_t)k[11]);
444 case 11:
c+=((uint32_t)k[10])<<8;
445 case 10:
c+=((uint32_t)k[9])<<16;
446 case 9 :
c+=((uint32_t)k[8])<<24;
448 case 7 : b+=((uint32_t)k[6])<<8;
449 case 6 : b+=((uint32_t)k[5])<<16;
450 case 5 : b+=((uint32_t)k[4])<<24;
452 case 3 : a+=((uint32_t)k[2])<<8;
453 case 2 : a+=((uint32_t)k[1])<<16;
454 case 1 : a+=((uint32_t)k[0])<<24;
uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval)
uint32_t jenkins_hash32(const uint32_t *k, size_t length, uint32_t initval)