50#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
51 __BYTE_ORDER == __LITTLE_ENDIAN) || \
52 (defined(i386) || defined(__i386__) || defined(__i486__) || \
53 defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL))
54#define HASH_LITTLE_ENDIAN 1
55#define HASH_BIG_ENDIAN 0
56#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
57 __BYTE_ORDER == __BIG_ENDIAN) || \
58 (defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel))
59#define HASH_LITTLE_ENDIAN 0
60#define HASH_BIG_ENDIAN 1
62#define HASH_LITTLE_ENDIAN 0
63#define HASH_BIG_ENDIAN 0
66#define hashsize(n) ((uint32_t)1<<(n))
67#define hashmask(n) (hashsize(n)-1)
68#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
116 a -= c; a ^= rot(c, 4); c += b; \
117 b -= a; b ^= rot(a, 6); a += c; \
118 c -= b; c ^= rot(b, 8); b += a; \
119 a -= c; a ^= rot(c,16); c += b; \
120 b -= a; b ^= rot(a,19); a += c; \
121 c -= b; c ^= rot(b, 4); b += a; \
149#define final(a,b,c) \
151 c ^= b; c -= rot(b,14); \
152 a ^= c; a -= rot(c,11); \
153 b ^= a; b -= rot(a,25); \
154 c ^= b; c -= rot(b,16); \
155 a ^= c; a -= rot(c,4); \
156 b ^= a; b -= rot(a,14); \
157 c ^= b; c -= rot(b,24); \
179 a = b = c = 0xdeadbeef + ( ( ( uint32_t ) length ) << 2 ) + initval;
182 while ( length > 3 ) {
223 a = b = c = 0xdeadbeef + ( ( uint32_t ) ( length << 2 ) ) + *pc;
227 while ( length > 3 ) {
281uint32_t
hashlittle(
const void *key,
size_t length, uint32_t initval ) {
289 a = b = c = 0xdeadbeef + ( ( uint32_t ) length ) + initval;
293 const uint32_t *k = (
const uint32_t * ) key;
297 while ( length > 12 ) {
325 c += k[2] & 0xffffff;
344 b += k[1] & 0xffffff;
359 a += k[0] & 0xffffff;
373 k8 = (
const uint8_t * ) k;
381 c += ( ( uint32_t ) k8[10] ) << 16;
383 c += ( ( uint32_t ) k8[9] ) << 8;
391 b += ( ( uint32_t ) k8[6] ) << 16;
393 b += ( ( uint32_t ) k8[5] ) << 8;
400 a += ( ( uint32_t ) k8[2] ) << 16;
402 a += ( ( uint32_t ) k8[1] ) << 8;
413 const uint16_t *k = (
const uint16_t * ) key;
417 while ( length > 12 ) {
418 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
419 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
420 c += k[4] + ( ( ( uint32_t ) k[5] ) << 16 );
427 k8 = (
const uint8_t * ) k;
430 c += k[4] + ( ( ( uint32_t ) k[5] ) << 16 );
431 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
432 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
435 c += ( ( uint32_t ) k8[10] ) << 16;
438 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
439 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
444 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
445 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
448 b += ( ( uint32_t ) k8[6] ) << 16;
451 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
456 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
459 a += ( ( uint32_t ) k8[2] ) << 16;
471 const uint8_t *k = (
const uint8_t * ) key;
474 while ( length > 12 ) {
476 a += ( ( uint32_t ) k[1] ) << 8;
477 a += ( ( uint32_t ) k[2] ) << 16;
478 a += ( ( uint32_t ) k[3] ) << 24;
480 b += ( ( uint32_t ) k[5] ) << 8;
481 b += ( ( uint32_t ) k[6] ) << 16;
482 b += ( ( uint32_t ) k[7] ) << 24;
484 c += ( ( uint32_t ) k[9] ) << 8;
485 c += ( ( uint32_t ) k[10] ) << 16;
486 c += ( ( uint32_t ) k[11] ) << 24;
495 c += ( ( uint32_t ) k[11] ) << 24;
497 c += ( ( uint32_t ) k[10] ) << 16;
499 c += ( ( uint32_t ) k[9] ) << 8;
503 b += ( ( uint32_t ) k[7] ) << 24;
505 b += ( ( uint32_t ) k[6] ) << 16;
507 b += ( ( uint32_t ) k[5] ) << 8;
511 a += ( ( uint32_t ) k[3] ) << 24;
513 a += ( ( uint32_t ) k[2] ) << 16;
515 a += ( ( uint32_t ) k[1] ) << 8;
550 a = b = c = 0xdeadbeef + ( ( uint32_t ) length ) + *pc;
555 const uint32_t *k = (
const uint32_t * ) key;
559 while ( length > 12 ) {
587 c += k[2] & 0xffffff;
606 b += k[1] & 0xffffff;
621 a += k[0] & 0xffffff;
637 k8 = (
const uint8_t * ) k;
645 c += ( ( uint32_t ) k8[10] ) << 16;
647 c += ( ( uint32_t ) k8[9] ) << 8;
655 b += ( ( uint32_t ) k8[6] ) << 16;
657 b += ( ( uint32_t ) k8[5] ) << 8;
664 a += ( ( uint32_t ) k8[2] ) << 16;
666 a += ( ( uint32_t ) k8[1] ) << 8;
679 const uint16_t *k = (
const uint16_t * ) key;
683 while ( length > 12 ) {
684 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
685 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
686 c += k[4] + ( ( ( uint32_t ) k[5] ) << 16 );
693 k8 = (
const uint8_t * ) k;
696 c += k[4] + ( ( ( uint32_t ) k[5] ) << 16 );
697 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
698 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
701 c += ( ( uint32_t ) k8[10] ) << 16;
704 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
705 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
710 b += k[2] + ( ( ( uint32_t ) k[3] ) << 16 );
711 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
714 b += ( ( uint32_t ) k8[6] ) << 16;
717 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
722 a += k[0] + ( ( ( uint32_t ) k[1] ) << 16 );
725 a += ( ( uint32_t ) k8[2] ) << 16;
739 const uint8_t *k = (
const uint8_t * ) key;
742 while ( length > 12 ) {
744 a += ( ( uint32_t ) k[1] ) << 8;
745 a += ( ( uint32_t ) k[2] ) << 16;
746 a += ( ( uint32_t ) k[3] ) << 24;
748 b += ( ( uint32_t ) k[5] ) << 8;
749 b += ( ( uint32_t ) k[6] ) << 16;
750 b += ( ( uint32_t ) k[7] ) << 24;
752 c += ( ( uint32_t ) k[9] ) << 8;
753 c += ( ( uint32_t ) k[10] ) << 16;
754 c += ( ( uint32_t ) k[11] ) << 24;
763 c += ( ( uint32_t ) k[11] ) << 24;
765 c += ( ( uint32_t ) k[10] ) << 16;
767 c += ( ( uint32_t ) k[9] ) << 8;
771 b += ( ( uint32_t ) k[7] ) << 24;
773 b += ( ( uint32_t ) k[6] ) << 16;
775 b += ( ( uint32_t ) k[5] ) << 8;
779 a += ( ( uint32_t ) k[3] ) << 24;
781 a += ( ( uint32_t ) k[2] ) << 16;
783 a += ( ( uint32_t ) k[1] ) << 8;
807uint32_t
hashbig(
const void *key,
size_t length, uint32_t initval ) {
815 a = b = c = 0xdeadbeef + ( ( uint32_t ) length ) + initval;
819 const uint32_t *k = (
const uint32_t * ) key;
823 while ( length > 12 ) {
851 c += k[2] & 0xffffff00;
856 c += k[2] & 0xffff0000;
861 c += k[2] & 0xff000000;
870 b += k[1] & 0xffffff00;
874 b += k[1] & 0xffff0000;
878 b += k[1] & 0xff000000;
885 a += k[0] & 0xffffff00;
888 a += k[0] & 0xffff0000;
891 a += k[0] & 0xff000000;
899 k8 = (
const uint8_t * ) k;
907 c += ( ( uint32_t ) k8[10] ) << 8;
909 c += ( ( uint32_t ) k8[9] ) << 16;
911 c += ( ( uint32_t ) k8[8] ) << 24;
917 b += ( ( uint32_t ) k8[6] ) << 8;
919 b += ( ( uint32_t ) k8[5] ) << 16;
921 b += ( ( uint32_t ) k8[4] ) << 24;
926 a += ( ( uint32_t ) k8[2] ) << 8;
928 a += ( ( uint32_t ) k8[1] ) << 16;
930 a += ( ( uint32_t ) k8[0] ) << 24;
939 const uint8_t *k = (
const uint8_t * ) key;
942 while ( length > 12 ) {
943 a += ( ( uint32_t ) k[0] ) << 24;
944 a += ( ( uint32_t ) k[1] ) << 16;
945 a += ( ( uint32_t ) k[2] ) << 8;
946 a += ( ( uint32_t ) k[3] );
947 b += ( ( uint32_t ) k[4] ) << 24;
948 b += ( ( uint32_t ) k[5] ) << 16;
949 b += ( ( uint32_t ) k[6] ) << 8;
950 b += ( ( uint32_t ) k[7] );
951 c += ( ( uint32_t ) k[8] ) << 24;
952 c += ( ( uint32_t ) k[9] ) << 16;
953 c += ( ( uint32_t ) k[10] ) << 8;
954 c += ( ( uint32_t ) k[11] );
965 c += ( ( uint32_t ) k[10] ) << 8;
967 c += ( ( uint32_t ) k[9] ) << 16;
969 c += ( ( uint32_t ) k[8] ) << 24;
973 b += ( ( uint32_t ) k[6] ) << 8;
975 b += ( ( uint32_t ) k[5] ) << 16;
977 b += ( ( uint32_t ) k[4] ) << 24;
981 a += ( ( uint32_t ) k[2] ) << 8;
983 a += ( ( uint32_t ) k[1] ) << 16;
985 a += ( ( uint32_t ) k[0] ) << 24;
1007 for ( i = 0; i < 256; ++i )
1009 for ( i = 0; i < 1; ++i ) {
1014 printf(
"time %d %.8x\n", z - a, h );
1023 uint8_t qa[MAXLEN + 1], qb[MAXLEN + 2], *a = &qa[0], *b = &qb[1];
1024 uint32_t c[HASHSTATE], d[HASHSTATE], i = 0, j = 0, k, l, m = 0, z;
1025 uint32_t e[HASHSTATE], f[HASHSTATE], g[HASHSTATE], h[HASHSTATE];
1026 uint32_t x[HASHSTATE], y[HASHSTATE];
1029 printf(
"No more than %d trials should ever be needed \n", MAXPAIR / 2 );
1030 for ( hlen = 0; hlen < MAXLEN; ++hlen ) {
1032 for ( i = 0; i < hlen; ++i ) {
1034 for ( j = 0; j < 8; ++j ) {
1036 for ( m = 1; m < 8; ++m ) {
1038 for ( l = 0; l < HASHSTATE; ++l )
1039 e[l] = f[l] = g[l] = h[l] = x[l] = y[l] =
1040 ~( ( uint32_t ) 0 );
1043 for ( k = 0; k < MAXPAIR; k += 2 ) {
1044 uint32_t finished = 1;
1046 for ( l = 0; l < hlen + 1; ++l ) {
1047 a[l] = b[l] = ( uint8_t ) 0;
1051 a[i] ^= ( k >> ( 8 - j ) );
1053 b[i] ^= ( ( k + 1 ) << j );
1054 b[i] ^= ( ( k + 1 ) >> ( 8 - j ) );
1057 for ( l = 0; l < HASHSTATE; ++l ) {
1058 e[l] &= ( c[l] ^ d[l] );
1059 f[l] &= ~( c[l] ^ d[l] );
1064 if ( e[l] | f[l] | g[l] | h[l] | x[l] | y[l] )
1072 if ( k == MAXPAIR ) {
1073 printf(
"Some bit didn't change: " );
1074 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x ",
1075 e[0], f[0], g[0], h[0], x[0], y[0] );
1076 printf(
"i %d j %d m %d len %d\n", i, j, m, hlen );
1084 if ( z < MAXPAIR ) {
1085 printf(
"Mix success %2d bytes %2d initvals ", i, m );
1086 printf(
"required %d trials\n", z / 2 );
1094 uint8_t buf[MAXLEN + 20], *b;
1097 "This is the time for all good men to come to the aid of their country...";
1100 "xThis is the time for all good men to come to the aid of their country...";
1103 "xxThis is the time for all good men to come to the aid of their country...";
1106 "xxxThis is the time for all good men to come to the aid of their country...";
1111 (
"Endianness. These lines should all be the same (for values filled in):\n" );
1113 (
"%.8x %.8x %.8x\n",
1114 hashword( (
const uint32_t * ) q, (
sizeof( q ) - 1 ) / 4, 13 ),
1115 hashword( (
const uint32_t * ) q, (
sizeof( q ) - 5 ) / 4, 13 ),
1116 hashword( (
const uint32_t * ) q, (
sizeof( q ) - 9 ) / 4, 13 ) );
1118 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1138 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1158 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1178 printf(
"%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
1204 printf(
"hashlittle2 and hashlittle mismatch\n" );
1210 if (
hashword( &len, 1, 47 ) != i )
1211 printf(
"hashword2 and hashword mismatch %x %x\n",
1215 for ( h = 0, b = buf + 1; h < 8; ++h, ++b ) {
1216 for ( i = 0; i < MAXLEN; ++i ) {
1218 for ( j = 0; j < i; ++j )
1223 *( b + i ) = ( uint8_t ) ~ 0;
1224 *( b - 1 ) = ( uint8_t ) ~ 0;
1227 if ( ( ref != x ) || ( ref != y ) ) {
1228 printf(
"alignment error: %.8x %.8x %.8x %d %d\n", ref, x, y,
1238 uint32_t h, i, state[HASHSTATE];
1242 for ( i = 0; i < HASHSTATE; ++i )
1244 printf(
"These should all be different\n" );
1245 for ( i = 0, h = 0; i < 8; ++i ) {
1247 printf(
"%2ld 0-byte strings, hash is %.8x\n", i, h );
1254 printf(
"hash is %.8lx %.8lx\n", c, b );
1255 b = 0xdeadbeef, c = 0,
hashlittle2(
"", 0, &c, &b );
1256 printf(
"hash is %.8lx %.8lx\n", c, b );
1257 b = 0xdeadbeef, c = 0xdeadbeef,
hashlittle2(
"", 0, &c, &b );
1258 printf(
"hash is %.8lx %.8lx\n", c, b );
1259 b = 0, c = 0,
hashlittle2(
"Four score and seven years ago", 30, &c, &b );
1260 printf(
"hash is %.8lx %.8lx\n", c, b );
1261 b = 1, c = 0,
hashlittle2(
"Four score and seven years ago", 30, &c, &b );
1262 printf(
"hash is %.8lx %.8lx\n", c, b );
1263 b = 0, c = 1,
hashlittle2(
"Four score and seven years ago", 30, &c, &b );
1264 printf(
"hash is %.8lx %.8lx\n", c, b );
1265 c =
hashlittle(
"Four score and seven years ago", 30, 0 );
1266 printf(
"hash is %.8lx\n", c );
1267 c =
hashlittle(
"Four score and seven years ago", 30, 1 );
1268 printf(
"hash is %.8lx\n", c );
int main(int argc, char *argv[])
main entry point; parse command line arguments, initialise the environment, and enter the read-eval-p...
uint32_t hashbig(const void *key, size_t length, uint32_t initval)
void hashlittle2(const void *key, size_t length, uint32_t *pc, uint32_t *pb)
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval)
lookup3.h
#define HASH_LITTLE_ENDIAN
uint32_t hashlittle(const void *key, size_t length, uint32_t initval)
void hashword2(const uint32_t *k, size_t length, uint32_t *pc, uint32_t *pb)