41 #if defined(_JLU3_SELFTEST)
42 # define _JLU3_jlu32w 1
43 # define _JLU3_jlu32l 1
44 # define _JLU3_jlu32lpair 1
45 # define _JLU3_jlu32b 1
52 const unsigned char uc[4];
54 # define HASH_LITTLE_ENDIAN (endian.uc[0] == (unsigned char) 0x44)
55 # define HASH_BIG_ENDIAN (endian.uc[0] == (unsigned char) 0x11)
59 # define ROTL32(x, s) (((x) << (s)) | ((x) >> (32 - (s))))
63 #define _JLU3_INIT(_h, _size) (0xdeadbeef + ((rpmuint32_t)(_size)) + (_h))
109 #define _JLU3_MIX(a,b,c) \
111 a -= c; a ^= ROTL32(c, 4); c += b; \
112 b -= a; b ^= ROTL32(a, 6); a += c; \
113 c -= b; c ^= ROTL32(b, 8); b += a; \
114 a -= c; a ^= ROTL32(c,16); c += b; \
115 b -= a; b ^= ROTL32(a,19); a += c; \
116 c -= b; c ^= ROTL32(b, 4); b += a; \
144 #define _JLU3_FINAL(a,b,c) \
146 c ^= b; c -= ROTL32(b,14); \
147 a ^= c; a -= ROTL32(c,11); \
148 b ^= a; b -= ROTL32(a,25); \
149 c ^= b; c -= ROTL32(b,16); \
150 a ^= c; a -= ROTL32(c,4); \
151 b ^= a; b -= ROTL32(a,14); \
152 c ^= b; c -= ROTL32(b,24); \
155 #if defined(_JLU3_jlu32w)
211 #if defined(_JLU3_jlu32l)
247 union {
const void *ptr;
size_t i; } u;
285 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
286 case 11: c += k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
287 case 10: c += k[2]&0xffff; b+=k[1]; a+=k[0];
break;
288 case 9: c += k[2]&0xff; b+=k[1]; a+=k[0];
break;
289 case 8: b += k[1]; a+=k[0];
break;
290 case 7: b += k[1]&0xffffff; a+=k[0];
break;
291 case 6: b += k[1]&0xffff; a+=k[0];
break;
292 case 5: b += k[1]&0xff; a+=k[0];
break;
293 case 4: a += k[0];
break;
294 case 3: a += k[0]&0xffffff;
break;
295 case 2: a += k[0]&0xffff;
break;
296 case 1: a += k[0]&0xff;
break;
304 case 12: c += k[2]; b+=k[1]; a+=k[0]
break;
308 case 8: b += k[1]; a+=k[0];
break;
312 case 4: a += k[0];
break;
315 case 1: a += k8[0];
break;
433 #if defined(_JLU3_jlu32lpair)
434 void jlu32lpair(
const void *key,
size_t size,
455 union {
const void *ptr;
size_t i; } u;
494 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
495 case 11: c += k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
496 case 10: c += k[2]&0xffff; b+=k[1]; a+=k[0];
break;
497 case 9: c += k[2]&0xff; b+=k[1]; a+=k[0];
break;
498 case 8: b += k[1]; a+=k[0];
break;
499 case 7: b += k[1]&0xffffff; a+=k[0];
break;
500 case 6: b += k[1]&0xffff; a+=k[0];
break;
501 case 5: b += k[1]&0xff; a+=k[0];
break;
502 case 4: a += k[0];
break;
503 case 3: a += k[0]&0xffffff;
break;
504 case 2: a += k[0]&0xffff;
break;
505 case 1: a += k[0]&0xff;
break;
513 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
517 case 8: b += k[1]; a+=k[0];
break;
521 case 4: a += k[0];
break;
524 case 1: a += k8[0];
break;
644 #if defined(_JLU3_jlu32b)
660 union {
const void *ptr;
size_t i; } u;
698 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
699 case 11: c += k[2]&0xffffff00; b+=k[1]; a+=k[0];
break;
700 case 10: c += k[2]&0xffff0000; b+=k[1]; a+=k[0];
break;
701 case 9: c += k[2]&0xff000000; b+=k[1]; a+=k[0];
break;
702 case 8: b += k[1]; a+=k[0];
break;
703 case 7: b += k[1]&0xffffff00; a+=k[0];
break;
704 case 6: b += k[1]&0xffff0000; a+=k[0];
break;
705 case 5: b += k[1]&0xff000000; a+=k[0];
break;
706 case 4: a += k[0];
break;
707 case 3: a += k[0]&0xffffff00;
break;
708 case 2: a += k[0]&0xffff0000;
break;
709 case 1: a += k[0]&0xff000000;
break;
717 case 12: c += k[2]; b+=k[1]; a+=k[0];
break;
721 case 8: b += k[1]; a+=k[0];
break;
725 case 4: a += k[0];
break;
783 #if defined(_JLU3_SELFTEST)
786 static void driver1(
void)
795 for (i=0; i<256; ++i) buf[i] =
'x';
796 for (i=0; i<1; ++i) {
797 h = jlu32l(h, &buf[0],
sizeof(buf[0]));
800 if (z-a > 0) printf(
"time %d %.8x\n", (
int)(z-a), h);
808 static void driver2(
void)
811 rpmuint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
812 rpmuint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
813 rpmuint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
817 printf(
"No more than %d trials should ever be needed \n",MAXPAIR/2);
818 for (hlen=0; hlen < MAXLEN; ++hlen) {
820 for (i=0; i<hlen; ++i) {
821 for (j=0; j<8; ++j) {
822 for (m=1; m<8; ++m) {
823 for (l=0; l<HASHSTATE; ++l)
827 for (k=0; k<MAXPAIR; k+=2) {
830 for (l=0; l<hlen+1; ++l) {a[l] = b[l] = (
rpmuint8_t)0;}
834 c[0] = jlu32l(m, a, hlen);
836 b[i] ^= ((k+1)>>(8-j));
837 d[0] = jlu32l(m, b, hlen);
839 for (l=0; l<HASHSTATE; ++l) {
841 f[l] &= ~(c[l]^d[l]);
846 if (e[l]|f[l]|g[l]|h[l]|x[l]|y[l]) finished=0;
852 printf(
"Some bit didn't change: ");
853 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x ",
854 e[0],f[0],g[0],h[0],x[0],y[0]);
855 printf(
"i %d j %d m %d len %d\n", i, j, m, hlen);
857 if (z == MAXPAIR)
goto done;
863 printf(
"Mix success %2d bytes %2d initvals ",i,m);
864 printf(
"required %d trials\n", z/2);
871 static void driver3(
void)
876 rpmuint8_t q[] =
"This is the time for all good men to come to the aid of their country...";
878 rpmuint8_t qq[] =
"xThis is the time for all good men to come to the aid of their country...";
880 rpmuint8_t qqq[] =
"xxThis is the time for all good men to come to the aid of their country...";
882 rpmuint8_t qqqq[] =
"xxxThis is the time for all good men to come to the aid of their country...";
887 printf(
"Endianness. These lines should all be the same (for values filled in):\n");
888 printf(
"%.8x %.8x %.8x\n",
889 jlu32w(m, (
const rpmuint32_t *)q, (
sizeof(q)-1)/4),
890 jlu32w(m, (
const rpmuint32_t *)q, (
sizeof(q)-5)/4),
891 jlu32w(m, (
const rpmuint32_t *)q, (
sizeof(q)-9)/4));
893 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
894 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
895 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
896 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
897 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
898 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
899 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
901 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
902 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
903 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
904 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
905 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
906 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
907 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
909 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
910 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
911 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
912 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
913 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
914 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
915 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
917 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
918 jlu32l(m, p,
sizeof(q)-1), jlu32l(m, p,
sizeof(q)-2),
919 jlu32l(m, p,
sizeof(q)-3), jlu32l(m, p,
sizeof(q)-4),
920 jlu32l(m, p,
sizeof(q)-5), jlu32l(m, p,
sizeof(q)-6),
921 jlu32l(m, p,
sizeof(q)-7), jlu32l(m, p,
sizeof(q)-8),
922 jlu32l(m, p,
sizeof(q)-9), jlu32l(m, p,
sizeof(q)-10),
923 jlu32l(m, p,
sizeof(q)-11), jlu32l(m, p,
sizeof(q)-12));
925 for (h=0, b=buf+1; h<8; ++h, ++b) {
926 for (i=0; i<MAXLEN; ++i) {
933 ref = jlu32l(m, b, len);
936 x = jlu32l(m, b, len);
937 y = jlu32l(m, b, len);
938 if ((ref != x) || (ref != y))
939 printf(
"alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y, h, i);
945 static void driver4(
void)
954 for (i=0; i<HASHSTATE; ++i)
956 printf(
"These should all be different\n");
958 for (i=0; i<8; ++i) {
959 h = jlu32l(h, buf, 0);
960 printf(
"%2ld 0-byte strings, hash is %.8x\n", (
long)i, h);
965 int main(
int argc,
char ** argv)