41 #include <sys/param.h>
51 #if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
52 __BYTE_ORDER == __LITTLE_ENDIAN) || \
53 (defined(i386) || defined(__i386__) || defined(__i486__) || \
54 defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL))
55 # define HASH_LITTLE_ENDIAN 1
56 # define HASH_BIG_ENDIAN 0
57 #elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
58 __BYTE_ORDER == __BIG_ENDIAN) || \
59 (defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel))
60 # define HASH_LITTLE_ENDIAN 0
61 # define HASH_BIG_ENDIAN 1
63 # define HASH_LITTLE_ENDIAN 0
64 # define HASH_BIG_ENDIAN 0
67 #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
115 a -= c; a ^= rot(c, 4); c += b; \
116 b -= a; b ^= rot(a, 6); a += c; \
117 c -= b; c ^= rot(b, 8); b += a; \
118 a -= c; a ^= rot(c,16); c += b; \
119 b -= a; b ^= rot(a,19); a += c; \
120 c -= b; c ^= rot(b, 4); b += a; \
148 #define final(a,b,c) \
150 c ^= b; c -= rot(b,14); \
151 a ^= c; a -= rot(c,11); \
152 b ^= a; b -= rot(a,25); \
153 c ^= b; c -= rot(b,16); \
154 a ^= c; a -= rot(c,4); \
155 b ^= a; b -= rot(a,14); \
156 c ^= b; c -= rot(b,24); \
180 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
225 a = b = c = 0xdeadbeef + ((uint32_t)(length<<2)) + *pc;
281 uint32_t
hashlittle(
const void *key,
size_t length, uint32_t initval)
284 union {
const void *ptr;
size_t i; } u;
287 a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
291 const uint32_t *k = (
const uint32_t *)key;
318 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
319 case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
320 case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0];
break;
321 case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0];
break;
322 case 8 : b+=k[1]; a+=k[0];
break;
323 case 7 : b+=k[1]&0xffffff; a+=k[0];
break;
324 case 6 : b+=k[1]&0xffff; a+=k[0];
break;
325 case 5 : b+=k[1]&0xff; a+=k[0];
break;
326 case 4 : a+=k[0];
break;
327 case 3 : a+=k[0]&0xffffff;
break;
328 case 2 : a+=k[0]&0xffff;
break;
329 case 1 : a+=k[0]&0xff;
break;
335 const uint8_t *k8 = (
const uint8_t *)k;
339 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
340 case 11: c+=((uint32_t)k8[10])<<16;
341 case 10: c+=((uint32_t)k8[9])<<8;
343 case 8 : b+=k[1]; a+=k[0];
break;
344 case 7 : b+=((uint32_t)k8[6])<<16;
345 case 6 : b+=((uint32_t)k8[5])<<8;
347 case 4 : a+=k[0];
break;
348 case 3 : a+=((uint32_t)k8[2])<<16;
349 case 2 : a+=((uint32_t)k8[1])<<8;
350 case 1 : a+=k8[0];
break;
357 const uint16_t *k = (
const uint16_t *)key;
363 a += k[0] + (((uint32_t)k[1])<<16);
364 b += k[2] + (((uint32_t)k[3])<<16);
365 c += k[4] + (((uint32_t)k[5])<<16);
372 k8 = (
const uint8_t *)k;
375 case 12: c+=k[4]+(((uint32_t)k[5])<<16);
376 b+=k[2]+(((uint32_t)k[3])<<16);
377 a+=k[0]+(((uint32_t)k[1])<<16);
379 case 11: c+=((uint32_t)k8[10])<<16;
381 b+=k[2]+(((uint32_t)k[3])<<16);
382 a+=k[0]+(((uint32_t)k[1])<<16);
385 case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
386 a+=k[0]+(((uint32_t)k[1])<<16);
388 case 7 : b+=((uint32_t)k8[6])<<16;
390 a+=k[0]+(((uint32_t)k[1])<<16);
393 case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
395 case 3 : a+=((uint32_t)k8[2])<<16;
404 const uint8_t *k = (
const uint8_t *)key;
410 a += ((uint32_t)k[1])<<8;
411 a += ((uint32_t)k[2])<<16;
412 a += ((uint32_t)k[3])<<24;
414 b += ((uint32_t)k[5])<<8;
415 b += ((uint32_t)k[6])<<16;
416 b += ((uint32_t)k[7])<<24;
418 c += ((uint32_t)k[9])<<8;
419 c += ((uint32_t)k[10])<<16;
420 c += ((uint32_t)k[11])<<24;
429 case 12: c+=((uint32_t)k[11])<<24;
430 case 11: c+=((uint32_t)k[10])<<16;
431 case 10: c+=((uint32_t)k[9])<<8;
433 case 8 : b+=((uint32_t)k[7])<<24;
434 case 7 : b+=((uint32_t)k[6])<<16;
435 case 6 : b+=((uint32_t)k[5])<<8;
437 case 4 : a+=((uint32_t)k[3])<<24;
438 case 3 : a+=((uint32_t)k[2])<<16;
439 case 2 : a+=((uint32_t)k[1])<<8;
485 union {
const void *ptr;
size_t i; } u;
488 a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
492 const uint32_t *k = (
const uint32_t *)key;
512 const uint8_t *k8 = (
const uint8_t *)k;
516 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
517 case 11: c+=((uint32_t)k8[10])<<16;
518 case 10: c+=((uint32_t)k8[9])<<8;
520 case 8 : b+=k[1]; a+=k[0];
break;
521 case 7 : b+=((uint32_t)k8[6])<<16;
522 case 6 : b+=((uint32_t)k8[5])<<8;
524 case 4 : a+=k[0];
break;
525 case 3 : a+=((uint32_t)k8[2])<<16;
526 case 2 : a+=((uint32_t)k8[1])<<8;
527 case 1 : a+=k8[0];
break;
531 const uint16_t *k = (
const uint16_t *)key;
537 a += k[0] + (((uint32_t)k[1])<<16);
538 b += k[2] + (((uint32_t)k[3])<<16);
539 c += k[4] + (((uint32_t)k[5])<<16);
546 k8 = (
const uint8_t *)k;
549 case 12: c+=k[4]+(((uint32_t)k[5])<<16);
550 b+=k[2]+(((uint32_t)k[3])<<16);
551 a+=k[0]+(((uint32_t)k[1])<<16);
553 case 11: c+=((uint32_t)k8[10])<<16;
555 b+=k[2]+(((uint32_t)k[3])<<16);
556 a+=k[0]+(((uint32_t)k[1])<<16);
559 case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
560 a+=k[0]+(((uint32_t)k[1])<<16);
562 case 7 : b+=((uint32_t)k8[6])<<16;
564 a+=k[0]+(((uint32_t)k[1])<<16);
567 case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
569 case 3 : a+=((uint32_t)k8[2])<<16;
578 const uint8_t *k = (
const uint8_t *)key;
584 a += ((uint32_t)k[1])<<8;
585 a += ((uint32_t)k[2])<<16;
586 a += ((uint32_t)k[3])<<24;
588 b += ((uint32_t)k[5])<<8;
589 b += ((uint32_t)k[6])<<16;
590 b += ((uint32_t)k[7])<<24;
592 c += ((uint32_t)k[9])<<8;
593 c += ((uint32_t)k[10])<<16;
594 c += ((uint32_t)k[11])<<24;
603 case 12: c+=((uint32_t)k[11])<<24;
604 case 11: c+=((uint32_t)k[10])<<16;
605 case 10: c+=((uint32_t)k[9])<<8;
607 case 8 : b+=((uint32_t)k[7])<<24;
608 case 7 : b+=((uint32_t)k[6])<<16;
609 case 6 : b+=((uint32_t)k[5])<<8;
611 case 4 : a+=((uint32_t)k[3])<<24;
612 case 3 : a+=((uint32_t)k[2])<<16;
613 case 2 : a+=((uint32_t)k[1])<<8;
642 union {
const void *ptr;
size_t i; } u;
645 a = b = c = 0xdeadbeef + ((uint32_t)length) + *pc;
650 const uint32_t *k = (
const uint32_t *)key;
677 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
678 case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
679 case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0];
break;
680 case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0];
break;
681 case 8 : b+=k[1]; a+=k[0];
break;
682 case 7 : b+=k[1]&0xffffff; a+=k[0];
break;
683 case 6 : b+=k[1]&0xffff; a+=k[0];
break;
684 case 5 : b+=k[1]&0xff; a+=k[0];
break;
685 case 4 : a+=k[0];
break;
686 case 3 : a+=k[0]&0xffffff;
break;
687 case 2 : a+=k[0]&0xffff;
break;
688 case 1 : a+=k[0]&0xff;
break;
689 case 0 : *pc=c; *pb=b;
return;
694 const uint8_t *k8 = (
const uint8_t *)k;
697 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
698 case 11: c+=((uint32_t)k8[10])<<16;
699 case 10: c+=((uint32_t)k8[9])<<8;
701 case 8 : b+=k[1]; a+=k[0];
break;
702 case 7 : b+=((uint32_t)k8[6])<<16;
703 case 6 : b+=((uint32_t)k8[5])<<8;
705 case 4 : a+=k[0];
break;
706 case 3 : a+=((uint32_t)k8[2])<<16;
707 case 2 : a+=((uint32_t)k8[1])<<8;
708 case 1 : a+=k8[0];
break;
709 case 0 : *pc=c; *pb=b;
return;
715 const uint16_t *k = (
const uint16_t *)key;
721 a += k[0] + (((uint32_t)k[1])<<16);
722 b += k[2] + (((uint32_t)k[3])<<16);
723 c += k[4] + (((uint32_t)k[5])<<16);
730 k8 = (
const uint8_t *)k;
733 case 12: c+=k[4]+(((uint32_t)k[5])<<16);
734 b+=k[2]+(((uint32_t)k[3])<<16);
735 a+=k[0]+(((uint32_t)k[1])<<16);
737 case 11: c+=((uint32_t)k8[10])<<16;
739 b+=k[2]+(((uint32_t)k[3])<<16);
740 a+=k[0]+(((uint32_t)k[1])<<16);
743 case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
744 a+=k[0]+(((uint32_t)k[1])<<16);
746 case 7 : b+=((uint32_t)k8[6])<<16;
748 a+=k[0]+(((uint32_t)k[1])<<16);
751 case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
753 case 3 : a+=((uint32_t)k8[2])<<16;
758 case 0 : *pc=c; *pb=b;
return;
762 const uint8_t *k = (
const uint8_t *)key;
768 a += ((uint32_t)k[1])<<8;
769 a += ((uint32_t)k[2])<<16;
770 a += ((uint32_t)k[3])<<24;
772 b += ((uint32_t)k[5])<<8;
773 b += ((uint32_t)k[6])<<16;
774 b += ((uint32_t)k[7])<<24;
776 c += ((uint32_t)k[9])<<8;
777 c += ((uint32_t)k[10])<<16;
778 c += ((uint32_t)k[11])<<24;
787 case 12: c+=((uint32_t)k[11])<<24;
788 case 11: c+=((uint32_t)k[10])<<16;
789 case 10: c+=((uint32_t)k[9])<<8;
791 case 8 : b+=((uint32_t)k[7])<<24;
792 case 7 : b+=((uint32_t)k[6])<<16;
793 case 6 : b+=((uint32_t)k[5])<<8;
795 case 4 : a+=((uint32_t)k[3])<<24;
796 case 3 : a+=((uint32_t)k[2])<<16;
797 case 2 : a+=((uint32_t)k[1])<<8;
800 case 0 : *pc=c; *pb=b;
return;
830 a = b = c = 0xdeadbeef + ((uint32_t)length) + *pc;
835 const uint32_t *k = (
const uint32_t *)key;
838 while (length > 12) {
853 const uint8_t *k8 = (
const uint8_t *)k;
861 c += ((uint32_t)k8[10]) << 16;
863 c += ((uint32_t)k8[9]) << 8;
871 b += ((uint32_t)k8[6]) << 16;
873 b += ((uint32_t)k8[5]) << 8;
880 a += ((uint32_t)k8[2]) << 16;
882 a += ((uint32_t)k8[1]) << 8;
893 const uint16_t *k = (
const uint16_t *)key;
897 while (length > 12) {
898 a += k[0] + (((uint32_t)k[1]) << 16);
899 b += k[2] + (((uint32_t)k[3]) << 16);
900 c += k[4] + (((uint32_t)k[5]) << 16);
907 k8 = (
const uint8_t *)k;
910 c += k[4] + (((uint32_t)k[5]) << 16);
911 b += k[2] + (((uint32_t)k[3]) << 16);
912 a += k[0] + (((uint32_t)k[1]) << 16);
915 c += ((uint32_t)k8[10]) << 16;
918 b += k[2] + (((uint32_t)k[3]) << 16);
919 a += k[0] + (((uint32_t)k[1]) << 16);
924 b += k[2] + (((uint32_t)k[3]) << 16);
925 a += k[0] + (((uint32_t)k[1]) << 16);
928 b += ((uint32_t)k8[6]) << 16;
931 a += k[0] + (((uint32_t)k[1]) << 16);
936 a += k[0] + (((uint32_t)k[1]) << 16);
939 a += ((uint32_t)k8[2]) << 16;
953 const uint8_t *k = (
const uint8_t *)key;
956 while (length > 12) {
958 a += ((uint32_t)k[1]) << 8;
959 a += ((uint32_t)k[2]) << 16;
960 a += ((uint32_t)k[3]) << 24;
962 b += ((uint32_t)k[5]) << 8;
963 b += ((uint32_t)k[6]) << 16;
964 b += ((uint32_t)k[7]) << 24;
966 c += ((uint32_t)k[9]) << 8;
967 c += ((uint32_t)k[10]) << 16;
968 c += ((uint32_t)k[11]) << 24;
978 c += ((uint32_t)k[11]) << 24;
980 c += ((uint32_t)k[10]) << 16;
982 c += ((uint32_t)k[9]) << 8;
986 b += ((uint32_t)k[7]) << 24;
988 b += ((uint32_t)k[6]) << 16;
990 b += ((uint32_t)k[5]) << 8;
994 a += ((uint32_t)k[3]) << 24;
996 a += ((uint32_t)k[2]) << 16;
998 a += ((uint32_t)k[1]) << 8;
1020 uint32_t
hashbig(
const void *key,
size_t length, uint32_t initval)
1023 union {
const void *ptr;
size_t i; } u;
1026 a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
1030 const uint32_t *k = (
const uint32_t *)key;
1057 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
1058 case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0];
break;
1059 case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0];
break;
1060 case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0];
break;
1061 case 8 : b+=k[1]; a+=k[0];
break;
1062 case 7 : b+=k[1]&0xffffff00; a+=k[0];
break;
1063 case 6 : b+=k[1]&0xffff0000; a+=k[0];
break;
1064 case 5 : b+=k[1]&0xff000000; a+=k[0];
break;
1065 case 4 : a+=k[0];
break;
1066 case 3 : a+=k[0]&0xffffff00;
break;
1067 case 2 : a+=k[0]&0xffff0000;
break;
1068 case 1 : a+=k[0]&0xff000000;
break;
1074 const uint8_t *k8 = (
const uint8_t *)k;
1077 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
1078 case 11: c+=((uint32_t)k8[10])<<8;
1079 case 10: c+=((uint32_t)k8[9])<<16;
1080 case 9 : c+=((uint32_t)k8[8])<<24;
1081 case 8 : b+=k[1]; a+=k[0];
break;
1082 case 7 : b+=((uint32_t)k8[6])<<8;
1083 case 6 : b+=((uint32_t)k8[5])<<16;
1084 case 5 : b+=((uint32_t)k8[4])<<24;
1085 case 4 : a+=k[0];
break;
1086 case 3 : a+=((uint32_t)k8[2])<<8;
1087 case 2 : a+=((uint32_t)k8[1])<<16;
1088 case 1 : a+=((uint32_t)k8[0])<<24;
break;
1095 const uint8_t *k = (
const uint8_t *)key;
1100 a += ((uint32_t)k[0])<<24;
1101 a += ((uint32_t)k[1])<<16;
1102 a += ((uint32_t)k[2])<<8;
1103 a += ((uint32_t)k[3]);
1104 b += ((uint32_t)k[4])<<24;
1105 b += ((uint32_t)k[5])<<16;
1106 b += ((uint32_t)k[6])<<8;
1107 b += ((uint32_t)k[7]);
1108 c += ((uint32_t)k[8])<<24;
1109 c += ((uint32_t)k[9])<<16;
1110 c += ((uint32_t)k[10])<<8;
1111 c += ((uint32_t)k[11]);
1121 case 11: c+=((uint32_t)k[10])<<8;
1122 case 10: c+=((uint32_t)k[9])<<16;
1123 case 9 : c+=((uint32_t)k[8])<<24;
1125 case 7 : b+=((uint32_t)k[6])<<8;
1126 case 6 : b+=((uint32_t)k[5])<<16;
1127 case 5 : b+=((uint32_t)k[4])<<24;
1129 case 3 : a+=((uint32_t)k[2])<<8;
1130 case 2 : a+=((uint32_t)k[1])<<16;
1131 case 1 : a+=((uint32_t)k[0])<<24;
1153 for (i=0; i<256; ++i) buf[i] =
'x';
1159 if (z-a > 0) printf(
"time %d %.8x\n", z-a, h);
1169 uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
1170 uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l,
m=0, z;
1171 uint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
1172 uint32_t x[HASHSTATE],y[HASHSTATE];
1175 printf(
"No more than %d trials should ever be needed \n",MAXPAIR/2);
1176 for (hlen=0; hlen < MAXLEN; ++hlen)
1179 for (i=0; i<hlen; ++i)
1183 for (
m = 1;
m < 8; ++
m)
1185 for (l = 0; l < HASHSTATE; ++l)
1186 e[l] = f[l] = g[l] = h[l] = x[l] = y[l] = ~((uint32_t)0);
1189 for (k = 0; k < MAXPAIR; k += 2) {
1190 uint32_t finished = 1;
1192 for (l = 0; l < hlen + 1; ++l) {
1193 a[l] = b[l] = (uint8_t)0;
1197 a[i] ^= (k >> (8 - j));
1199 b[i] ^= ((k + 1) << j);
1200 b[i] ^= ((k + 1) >> (8 - j));
1203 for (l = 0; l < HASHSTATE; ++l) {
1204 e[l] &= (c[l] ^ d[l]);
1205 f[l] &= ~(c[l] ^ d[l]);
1210 if (e[l] | f[l] | g[l] | h[l] | x[l] | y[l])
1219 printf(
"Some bit didn't change: ");
1220 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x ", e[0], f[0], g[0], h[0], x[0], y[0]);
1221 printf(
"i %d j %d m %d len %d\n", i, j,
m, hlen);
1231 printf(
"Mix success %2d bytes %2d initvals ",i,
m);
1232 printf(
"required %d trials\n", z/2);
1241 uint8_t buf[MAXLEN+20], *b;
1243 uint8_t q[] =
"This is the time for all good men to come to the aid of their country...";
1245 uint8_t qq[] =
"xThis is the time for all good men to come to the aid of their country...";
1247 uint8_t qqq[] =
"xxThis is the time for all good men to come to the aid of their country...";
1249 uint8_t qqqq[] =
"xxxThis is the time for all good men to come to the aid of their country...";
1253 printf(
"Endianness. These lines should all be the same (for values filled in):\n");
1254 printf(
"%.8x %.8x %.8x\n",
1255 hashword((
const uint32_t *)q, (
sizeof(q)-1)/4, 13),
1256 hashword((
const uint32_t *)q, (
sizeof(q)-5)/4, 13),
1257 hashword((
const uint32_t *)q, (
sizeof(q)-9)/4, 13));
1259 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1267 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1275 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1283 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1296 printf(
"hashlittle2 and hashlittle mismatch\n");
1303 printf(
"hashword2 and hashword mismatch %x %x\n",
1307 for (h=0, b=buf+1; h<8; ++h, ++b)
1309 for (i=0; i<MAXLEN; ++i)
1312 for (j=0; j<i; ++j) *(b+j)=0;
1320 if ((ref != x) || (ref != y))
1322 printf(
"alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y,
1333 uint32_t h,i,state[HASHSTATE];
1337 for (i=0; i<HASHSTATE; ++i) state[i] = 1;
1338 printf(
"These should all be different\n");
1339 for (i=0, h=0; i<8; ++i)
1342 printf(
"%2ld 0-byte strings, hash is %.8x\n", i, h);
1350 printf(
"hash is %.8lx %.8lx\n", c, b);
1352 printf(
"hash is %.8lx %.8lx\n", c, b);
1353 b=0xdeadbeef, c=0xdeadbeef,
hashlittle2(
"", 0, &c, &b);
1354 printf(
"hash is %.8lx %.8lx\n", c, b);
1355 b=0, c=0,
hashlittle2(
"Four score and seven years ago", 30, &c, &b);
1356 printf(
"hash is %.8lx %.8lx\n", c, b);
1357 b=1, c=0,
hashlittle2(
"Four score and seven years ago", 30, &c, &b);
1358 printf(
"hash is %.8lx %.8lx\n", c, b);
1359 b=0, c=1,
hashlittle2(
"Four score and seven years ago", 30, &c, &b);
1360 printf(
"hash is %.8lx %.8lx\n", c, b);
1361 c =
hashlittle(
"Four score and seven years ago", 30, 0);
1362 printf(
"hash is %.8lx\n", c);
1363 c =
hashlittle(
"Four score and seven years ago", 30, 1);
1364 printf(
"hash is %.8lx\n", c);