40 #if defined(_JLU3_SELFTEST)
41 # define _JLU3_jlu32w 1
42 # define _JLU3_jlu32l 1
43 # define _JLU3_jlu32lpair 1
44 # define _JLU3_jlu32b 1
51 const unsigned char uc[4];
53 # define HASH_LITTLE_ENDIAN (endian.uc[0] == 0x44)
54 # define HASH_BIG_ENDIAN (endian.uc[0] == 0x11)
58 # define ROTL32(x, s) (((x) << (s)) | ((x) >> (32 - (s))))
62 #define _JLU3_INIT(_h, _size) (0xdeadbeef + ((uint32_t)(_size)) + (_h))
108 #define _JLU3_MIX(a,b,c) \
110 a -= c; a ^= ROTL32(c, 4); c += b; \
111 b -= a; b ^= ROTL32(a, 6); a += c; \
112 c -= b; c ^= ROTL32(b, 8); b += a; \
113 a -= c; a ^= ROTL32(c,16); c += b; \
114 b -= a; b ^= ROTL32(a,19); a += c; \
115 c -= b; c ^= ROTL32(b, 4); b += a; \
143 #define _JLU3_FINAL(a,b,c) \
145 c ^= b; c -= ROTL32(b,14); \
146 a ^= c; a -= ROTL32(c,11); \
147 b ^= a; b -= ROTL32(a,25); \
148 c ^= b; c -= ROTL32(b,16); \
149 a ^= c; a -= ROTL32(c,4); \
150 b ^= a; b -= ROTL32(a,14); \
151 c ^= b; c -= ROTL32(b,24); \
154 #if defined(_JLU3_jlu32w)
155 uint32_t jlu32w(uint32_t h,
const uint32_t *k,
size_t size)
175 uint32_t jlu32w(uint32_t h,
const uint32_t *k,
size_t size)
177 uint32_t a =
_JLU3_INIT(h, (size *
sizeof(*k)));
210 #if defined(_JLU3_jlu32l)
211 uint32_t jlu32l(uint32_t h,
const void *key,
size_t size)
244 uint32_t jlu32l(uint32_t h,
const void *key,
size_t size)
246 union {
const void *ptr;
size_t i; } u;
256 const uint32_t *k = (
const uint32_t *)key;
284 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
285 case 11: c += k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
286 case 10: c += k[2]&0xffff; b+=k[1]; a+=k[0];
break;
287 case 9: c += k[2]&0xff; b+=k[1]; a+=k[0];
break;
288 case 8: b += k[1]; a+=k[0];
break;
289 case 7: b += k[1]&0xffffff; a+=k[0];
break;
290 case 6: b += k[1]&0xffff; a+=k[0];
break;
291 case 5: b += k[1]&0xff; a+=k[0];
break;
292 case 4: a += k[0];
break;
293 case 3: a += k[0]&0xffffff;
break;
294 case 2: a += k[0]&0xffff;
break;
295 case 1: a += k[0]&0xff;
break;
301 k8 = (
const uint8_t *)k;
303 case 12: c += k[2]; b+=k[1]; a+=k[0]
break;
304 case 11: c += ((uint32_t)k8[10])<<16;
305 case 10: c += ((uint32_t)k8[9])<<8;
307 case 8: b += k[1]; a+=k[0];
break;
308 case 7: b += ((uint32_t)k8[6])<<16;
309 case 6: b += ((uint32_t)k8[5])<<8;
311 case 4: a += k[0];
break;
312 case 3: a += ((uint32_t)k8[2])<<16;
313 case 2: a += ((uint32_t)k8[1])<<8;
314 case 1: a += k8[0];
break;
321 const uint16_t *k = (
const uint16_t *)key;
326 a += k[0] + (((uint32_t)k[1])<<16);
327 b += k[2] + (((uint32_t)k[3])<<16);
328 c += k[4] + (((uint32_t)k[5])<<16);
335 k8 = (
const uint8_t *)k;
338 c += k[4]+(((uint32_t)k[5])<<16);
339 b += k[2]+(((uint32_t)k[3])<<16);
340 a += k[0]+(((uint32_t)k[1])<<16);
343 c += ((uint32_t)k8[10])<<16;
347 b += k[2]+(((uint32_t)k[3])<<16);
348 a += k[0]+(((uint32_t)k[1])<<16);
354 b += k[2]+(((uint32_t)k[3])<<16);
355 a += k[0]+(((uint32_t)k[1])<<16);
358 b += ((uint32_t)k8[6])<<16;
362 a += k[0]+(((uint32_t)k[1])<<16);
368 a += k[0]+(((uint32_t)k[1])<<16);
371 a += ((uint32_t)k8[2])<<16;
384 const uint8_t *k = (
const uint8_t *)key;
389 a += ((uint32_t)k[1])<<8;
390 a += ((uint32_t)k[2])<<16;
391 a += ((uint32_t)k[3])<<24;
393 b += ((uint32_t)k[5])<<8;
394 b += ((uint32_t)k[6])<<16;
395 b += ((uint32_t)k[7])<<24;
397 c += ((uint32_t)k[9])<<8;
398 c += ((uint32_t)k[10])<<16;
399 c += ((uint32_t)k[11])<<24;
407 case 12: c += ((uint32_t)k[11])<<24;
408 case 11: c += ((uint32_t)k[10])<<16;
409 case 10: c += ((uint32_t)k[9])<<8;
411 case 8: b += ((uint32_t)k[7])<<24;
412 case 7: b += ((uint32_t)k[6])<<16;
413 case 6: b += ((uint32_t)k[5])<<8;
415 case 4: a += ((uint32_t)k[3])<<24;
416 case 3: a += ((uint32_t)k[2])<<16;
417 case 2: a += ((uint32_t)k[1])<<8;
432 #if defined(_JLU3_jlu32lpair)
433 void jlu32lpair(
const void *key,
size_t size,
434 uint32_t *pc, uint32_t *pb)
452 void jlu32lpair(
const void *key,
size_t size, uint32_t *pc, uint32_t *pb)
454 union {
const void *ptr;
size_t i; } u;
466 const uint32_t *k = (
const uint32_t *)key;
493 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
494 case 11: c += k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
495 case 10: c += k[2]&0xffff; b+=k[1]; a+=k[0];
break;
496 case 9: c += k[2]&0xff; b+=k[1]; a+=k[0];
break;
497 case 8: b += k[1]; a+=k[0];
break;
498 case 7: b += k[1]&0xffffff; a+=k[0];
break;
499 case 6: b += k[1]&0xffff; a+=k[0];
break;
500 case 5: b += k[1]&0xff; a+=k[0];
break;
501 case 4: a += k[0];
break;
502 case 3: a += k[0]&0xffffff;
break;
503 case 2: a += k[0]&0xffff;
break;
504 case 1: a += k[0]&0xff;
break;
510 k8 = (
const uint8_t *)k;
512 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
513 case 11: c += ((uint32_t)k8[10])<<16;
514 case 10: c += ((uint32_t)k8[9])<<8;
516 case 8: b += k[1]; a+=k[0];
break;
517 case 7: b += ((uint32_t)k8[6])<<16;
518 case 6: b += ((uint32_t)k8[5])<<8;
520 case 4: a += k[0];
break;
521 case 3: a += ((uint32_t)k8[2])<<16;
522 case 2: a += ((uint32_t)k8[1])<<8;
523 case 1: a += k8[0];
break;
530 const uint16_t *k = (
const uint16_t *)key;
535 a += k[0] + (((uint32_t)k[1])<<16);
536 b += k[2] + (((uint32_t)k[3])<<16);
537 c += k[4] + (((uint32_t)k[5])<<16);
544 k8 = (
const uint8_t *)k;
547 c += k[4]+(((uint32_t)k[5])<<16);
548 b += k[2]+(((uint32_t)k[3])<<16);
549 a += k[0]+(((uint32_t)k[1])<<16);
552 c += ((uint32_t)k8[10])<<16;
556 b += k[2]+(((uint32_t)k[3])<<16);
557 a += k[0]+(((uint32_t)k[1])<<16);
563 b += k[2]+(((uint32_t)k[3])<<16);
564 a += k[0]+(((uint32_t)k[1])<<16);
567 b += ((uint32_t)k8[6])<<16;
571 a += k[0]+(((uint32_t)k[1])<<16);
577 a += k[0]+(((uint32_t)k[1])<<16);
580 a += ((uint32_t)k8[2])<<16;
593 const uint8_t *k = (
const uint8_t *)key;
598 a += ((uint32_t)k[1])<<8;
599 a += ((uint32_t)k[2])<<16;
600 a += ((uint32_t)k[3])<<24;
602 b += ((uint32_t)k[5])<<8;
603 b += ((uint32_t)k[6])<<16;
604 b += ((uint32_t)k[7])<<24;
606 c += ((uint32_t)k[9])<<8;
607 c += ((uint32_t)k[10])<<16;
608 c += ((uint32_t)k[11])<<24;
616 case 12: c += ((uint32_t)k[11])<<24;
617 case 11: c += ((uint32_t)k[10])<<16;
618 case 10: c += ((uint32_t)k[9])<<8;
620 case 8: b += ((uint32_t)k[7])<<24;
621 case 7: b += ((uint32_t)k[6])<<16;
622 case 6: b += ((uint32_t)k[5])<<8;
624 case 4: a += ((uint32_t)k[3])<<24;
625 case 3: a += ((uint32_t)k[2])<<16;
626 case 2: a += ((uint32_t)k[1])<<8;
643 #if defined(_JLU3_jlu32b)
644 uint32_t jlu32b(uint32_t h,
const void *key,
size_t size)
657 uint32_t jlu32b(uint32_t h,
const void *key,
size_t size)
659 union {
const void *ptr;
size_t i; } u;
669 const uint32_t *k = (
const uint32_t *)key;
697 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
698 case 11: c += k[2]&0xffffff00; b+=k[1]; a+=k[0];
break;
699 case 10: c += k[2]&0xffff0000; b+=k[1]; a+=k[0];
break;
700 case 9: c += k[2]&0xff000000; b+=k[1]; a+=k[0];
break;
701 case 8: b += k[1]; a+=k[0];
break;
702 case 7: b += k[1]&0xffffff00; a+=k[0];
break;
703 case 6: b += k[1]&0xffff0000; a+=k[0];
break;
704 case 5: b += k[1]&0xff000000; a+=k[0];
break;
705 case 4: a += k[0];
break;
706 case 3: a += k[0]&0xffffff00;
break;
707 case 2: a += k[0]&0xffff0000;
break;
708 case 1: a += k[0]&0xff000000;
break;
714 k8 = (
const uint8_t *)k;
716 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
717 case 11: c += ((uint32_t)k8[10])<<8;
718 case 10: c += ((uint32_t)k8[9])<<16;
719 case 9: c += ((uint32_t)k8[8])<<24;
720 case 8: b += k[1]; a+=k[0];
break;
721 case 7: b += ((uint32_t)k8[6])<<8;
722 case 6: b += ((uint32_t)k8[5])<<16;
723 case 5: b += ((uint32_t)k8[4])<<24;
724 case 4: a += k[0];
break;
725 case 3: a += ((uint32_t)k8[2])<<8;
726 case 2: a += ((uint32_t)k8[1])<<16;
727 case 1: a += ((uint32_t)k8[0])<<24;
break;
734 const uint8_t *k = (
const uint8_t *)key;
738 a += ((uint32_t)k[0])<<24;
739 a += ((uint32_t)k[1])<<16;
740 a += ((uint32_t)k[2])<<8;
741 a += ((uint32_t)k[3]);
742 b += ((uint32_t)k[4])<<24;
743 b += ((uint32_t)k[5])<<16;
744 b += ((uint32_t)k[6])<<8;
745 b += ((uint32_t)k[7]);
746 c += ((uint32_t)k[8])<<24;
747 c += ((uint32_t)k[9])<<16;
748 c += ((uint32_t)k[10])<<8;
749 c += ((uint32_t)k[11]);
758 case 11: c += ((uint32_t)k[10])<<8;
759 case 10: c += ((uint32_t)k[9])<<16;
760 case 9: c += ((uint32_t)k[8])<<24;
762 case 7: b += ((uint32_t)k[6])<<8;
763 case 6: b += ((uint32_t)k[5])<<16;
764 case 5: b += ((uint32_t)k[4])<<24;
766 case 3: a += ((uint32_t)k[2])<<8;
767 case 2: a += ((uint32_t)k[1])<<16;
768 case 1: a += ((uint32_t)k[0])<<24;
782 #if defined(_JLU3_SELFTEST)
785 static void driver1(
void)
794 for (i=0; i<256; ++i) buf[i] =
'x';
795 for (i=0; i<1; ++i) {
796 h = jlu32l(h, &buf[0],
sizeof(buf[0]));
799 if (z-a > 0) printf(
"time %d %.8x\n", (
int)(z-a), h);
807 static void driver2(
void)
810 uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
811 uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
812 uint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
813 uint32_t x[HASHSTATE],y[HASHSTATE];
816 printf(
"No more than %d trials should ever be needed \n",MAXPAIR/2);
817 for (hlen=0; hlen < MAXLEN; ++hlen) {
819 for (i=0; i<hlen; ++i) {
820 for (j=0; j<8; ++j) {
821 for (m=1; m<8; ++m) {
822 for (l=0; l<HASHSTATE; ++l)
823 e[l]=f[l]=g[l]=h[l]=x[l]=y[l]=~((uint32_t)0);
826 for (k=0; k<MAXPAIR; k+=2) {
829 for (l=0; l<hlen+1; ++l) {a[l] = b[l] = (uint8_t)0;}
833 c[0] = jlu32l(m, a, hlen);
835 b[i] ^= ((k+1)>>(8-j));
836 d[0] = jlu32l(m, b, hlen);
838 for (l=0; l<HASHSTATE; ++l) {
840 f[l] &= ~(c[l]^d[l]);
845 if (e[l]|f[l]|g[l]|h[l]|x[l]|y[l]) finished=0;
851 printf(
"Some bit didn't change: ");
852 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x ",
853 e[0],f[0],g[0],h[0],x[0],y[0]);
854 printf(
"i %d j %d m %d len %d\n", i, j, m, hlen);
856 if (z == MAXPAIR)
goto done;
862 printf(
"Mix success %2d bytes %2d initvals ",i,m);
863 printf(
"required %d trials\n", z/2);
870 static void driver3(
void)
873 uint8_t buf[MAXLEN+20], *b;
875 uint8_t q[] =
"This is the time for all good men to come to the aid of their country...";
877 uint8_t qq[] =
"xThis is the time for all good men to come to the aid of their country...";
879 uint8_t qqq[] =
"xxThis is the time for all good men to come to the aid of their country...";
881 uint8_t qqqq[] =
"xxxThis is the time for all good men to come to the aid of their country...";
886 printf(
"Endianness. These lines should all be the same (for values filled in):\n");
887 printf(
"%.8x %.8x %.8x\n",
888 jlu32w(m, (
const uint32_t *)q, (
sizeof(q)-1)/4),
889 jlu32w(m, (
const uint32_t *)q, (
sizeof(q)-5)/4),
890 jlu32w(m, (
const uint32_t *)q, (
sizeof(q)-9)/4));
892 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
893 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
894 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
895 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
896 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
897 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
898 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
900 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
901 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
902 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
903 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
904 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
905 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
906 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
908 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
909 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
910 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
911 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
912 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
913 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
914 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
916 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
917 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
918 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
919 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
920 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
921 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
922 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
924 for (h=0, b=buf+1; h<8; ++h, ++b) {
925 for (i=0; i<MAXLEN; ++i) {
932 ref = jlu32l(m, b, len);
935 x = jlu32l(m, b, len);
936 y = jlu32l(m, b, len);
937 if ((ref != x) || (ref != y))
938 printf(
"alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y, h, i);
944 static void driver4(
void)
950 uint32_t state[HASHSTATE];
953 for (i=0; i<HASHSTATE; ++i)
955 printf(
"These should all be different\n");
957 for (i=0; i<8; ++i) {
958 h = jlu32l(h, buf, 0);
959 printf(
"%2ld 0-byte strings, hash is %.8x\n", (
long)i, h);
964 int main(
int argc,
char ** argv)