11 # define CLOCKS_PER_SEC (CLK_TCK)
56 #include <sys/param.h>
65 #if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
66 __BYTE_ORDER == __LITTLE_ENDIAN) || \
67 (defined(i386) || defined(__i386__) || defined(__i486__) || \
68 defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL))
69 # define HASH_LITTLE_ENDIAN 1
70 # define HASH_BIG_ENDIAN 0
71 #elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
72 __BYTE_ORDER == __BIG_ENDIAN) || \
73 (defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel))
74 # define HASH_LITTLE_ENDIAN 0
75 # define HASH_BIG_ENDIAN 1
77 # define HASH_LITTLE_ENDIAN 0
78 # define HASH_BIG_ENDIAN 0
81 #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
129 a -= c; a ^= rot(c, 4); c += b; \
130 b -= a; b ^= rot(a, 6); a += c; \
131 c -= b; c ^= rot(b, 8); b += a; \
132 a -= c; a ^= rot(c,16); c += b; \
133 b -= a; b ^= rot(a,19); a += c; \
134 c -= b; c ^= rot(b, 4); b += a; \
162 #define final(a,b,c) \
164 c ^= b; c -= rot(b, 14); \
165 a ^= c; a -= rot(c, 11); \
166 b ^= a; b -= rot(a, 25); \
167 c ^= b; c -= rot(b, 16); \
168 a ^= c; a -= rot(c, 4); \
169 b ^= a; b -= rot(a, 14); \
170 c ^= b; c -= rot(b, 24); \
194 a =
b =
c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
239 a =
b =
c = 0xdeadbeef + ((uint32_t)(length<<2)) + *pc;
295 uint32_t
hashlittle(
const void *key,
size_t length, uint32_t initval)
298 union {
const void *ptr;
size_t i; } u;
301 a =
b =
c = 0xdeadbeef + ((uint32_t)length) + initval;
305 const uint32_t *
k = (
const uint32_t *)key;
321 k8 = (
const uint8_t *)
k;
324 case 12:
c+=
k[2];
b+=
k[1]; a+=
k[0];
break;
325 case 11:
c+=((uint32_t)k8[10])<<16;
326 case 10:
c+=((uint32_t)k8[9])<<8;
328 case 8 :
b+=
k[1]; a+=
k[0];
break;
329 case 7 :
b+=((uint32_t)k8[6])<<16;
330 case 6 :
b+=((uint32_t)k8[5])<<8;
332 case 4 : a+=
k[0];
break;
333 case 3 : a+=((uint32_t)k8[2])<<16;
334 case 2 : a+=((uint32_t)k8[1])<<8;
335 case 1 : a+=k8[0];
break;
340 const uint16_t *
k = (
const uint16_t *)key;
346 a +=
k[0] + (((uint32_t)
k[1])<<16);
347 b +=
k[2] + (((uint32_t)
k[3])<<16);
348 c +=
k[4] + (((uint32_t)
k[5])<<16);
355 k8 = (
const uint8_t *)
k;
358 case 12:
c+=
k[4]+(((uint32_t)
k[5])<<16);
359 b+=
k[2]+(((uint32_t)
k[3])<<16);
360 a+=
k[0]+(((uint32_t)
k[1])<<16);
362 case 11:
c+=((uint32_t)k8[10])<<16;
364 b+=
k[2]+(((uint32_t)
k[3])<<16);
365 a+=
k[0]+(((uint32_t)
k[1])<<16);
368 case 8 :
b+=
k[2]+(((uint32_t)
k[3])<<16);
369 a+=
k[0]+(((uint32_t)
k[1])<<16);
371 case 7 :
b+=((uint32_t)k8[6])<<16;
373 a+=
k[0]+(((uint32_t)
k[1])<<16);
376 case 4 : a+=
k[0]+(((uint32_t)
k[1])<<16);
378 case 3 : a+=((uint32_t)k8[2])<<16;
387 const uint8_t *
k = (
const uint8_t *)key;
393 a += ((uint32_t)
k[1])<<8;
394 a += ((uint32_t)
k[2])<<16;
395 a += ((uint32_t)
k[3])<<24;
397 b += ((uint32_t)
k[5])<<8;
398 b += ((uint32_t)
k[6])<<16;
399 b += ((uint32_t)
k[7])<<24;
401 c += ((uint32_t)
k[9])<<8;
402 c += ((uint32_t)
k[10])<<16;
403 c += ((uint32_t)
k[11])<<24;
412 case 12:
c+=((uint32_t)
k[11])<<24;
413 case 11:
c+=((uint32_t)
k[10])<<16;
414 case 10:
c+=((uint32_t)
k[9])<<8;
417 case 8 :
b+=((uint32_t)
k[7])<<24;
418 case 7 :
b+=((uint32_t)
k[6])<<16;
419 case 6 :
b+=((uint32_t)
k[5])<<8;
422 case 4 : a+=((uint32_t)
k[3])<<24;
423 case 3 : a+=((uint32_t)
k[2])<<16;
424 case 2 : a+=((uint32_t)
k[1])<<8;
454 union {
const void *ptr;
size_t i; } u;
457 a =
b =
c = 0xdeadbeef + ((uint32_t)length) + *pc;
462 const uint32_t *
k = (
const uint32_t *)key;
478 k8 = (
const uint8_t *)
k;
481 case 12:
c+=
k[2];
b+=
k[1]; a+=
k[0];
break;
482 case 11:
c+=((uint32_t)k8[10])<<16;
483 case 10:
c+=((uint32_t)k8[9])<<8;
485 case 8 :
b+=
k[1]; a+=
k[0];
break;
486 case 7 :
b+=((uint32_t)k8[6])<<16;
487 case 6 :
b+=((uint32_t)k8[5])<<8;
489 case 4 : a+=
k[0];
break;
490 case 3 : a+=((uint32_t)k8[2])<<16;
491 case 2 : a+=((uint32_t)k8[1])<<8;
492 case 1 : a+=k8[0];
break;
493 case 0 : *pc=
c; *pb=
b;
return;
497 const uint16_t *
k = (
const uint16_t *)key;
503 a +=
k[0] + (((uint32_t)
k[1])<<16);
504 b +=
k[2] + (((uint32_t)
k[3])<<16);
505 c +=
k[4] + (((uint32_t)
k[5])<<16);
512 k8 = (
const uint8_t *)
k;
515 case 12:
c+=
k[4]+(((uint32_t)
k[5])<<16);
516 b+=
k[2]+(((uint32_t)
k[3])<<16);
517 a+=
k[0]+(((uint32_t)
k[1])<<16);
519 case 11:
c+=((uint32_t)k8[10])<<16;
521 b+=
k[2]+(((uint32_t)
k[3])<<16);
522 a+=
k[0]+(((uint32_t)
k[1])<<16);
525 case 8 :
b+=
k[2]+(((uint32_t)
k[3])<<16);
526 a+=
k[0]+(((uint32_t)
k[1])<<16);
528 case 7 :
b+=((uint32_t)k8[6])<<16;
530 a+=
k[0]+(((uint32_t)
k[1])<<16);
533 case 4 : a+=
k[0]+(((uint32_t)
k[1])<<16);
535 case 3 : a+=((uint32_t)k8[2])<<16;
540 case 0 : *pc=
c; *pb=
b;
return;
544 const uint8_t *
k = (
const uint8_t *)key;
550 a += ((uint32_t)
k[1])<<8;
551 a += ((uint32_t)
k[2])<<16;
552 a += ((uint32_t)
k[3])<<24;
554 b += ((uint32_t)
k[5])<<8;
555 b += ((uint32_t)
k[6])<<16;
556 b += ((uint32_t)
k[7])<<24;
558 c += ((uint32_t)
k[9])<<8;
559 c += ((uint32_t)
k[10])<<16;
560 c += ((uint32_t)
k[11])<<24;
569 case 12:
c+=((uint32_t)
k[11])<<24;
570 case 11:
c+=((uint32_t)
k[10])<<16;
571 case 10:
c+=((uint32_t)
k[9])<<8;
573 case 8 :
b+=((uint32_t)
k[7])<<24;
574 case 7 :
b+=((uint32_t)
k[6])<<16;
575 case 6 :
b+=((uint32_t)
k[5])<<8;
577 case 4 : a+=((uint32_t)
k[3])<<24;
578 case 3 : a+=((uint32_t)
k[2])<<16;
579 case 2 : a+=((uint32_t)
k[1])<<8;
582 case 0 : *pc=
c; *pb=
b;
return;
598 uint32_t
hashbig(
const void *key,
size_t length, uint32_t initval)
601 union {
const void *ptr;
size_t i; } u;
604 a =
b =
c = 0xdeadbeef + ((uint32_t)length) + initval;
608 const uint32_t *
k = (
const uint32_t *)key;
624 k8 = (
const uint8_t *)
k;
627 case 12:
c+=
k[2];
b+=
k[1]; a+=
k[0];
break;
628 case 11:
c+=((uint32_t)k8[10])<<8;
629 case 10:
c+=((uint32_t)k8[9])<<16;
630 case 9 :
c+=((uint32_t)k8[8])<<24;
631 case 8 :
b+=
k[1]; a+=
k[0];
break;
632 case 7 :
b+=((uint32_t)k8[6])<<8;
633 case 6 :
b+=((uint32_t)k8[5])<<16;
634 case 5 :
b+=((uint32_t)k8[4])<<24;
635 case 4 : a+=
k[0];
break;
636 case 3 : a+=((uint32_t)k8[2])<<8;
637 case 2 : a+=((uint32_t)k8[1])<<16;
638 case 1 : a+=((uint32_t)k8[0])<<24;
break;
643 const uint8_t *
k = (
const uint8_t *)key;
648 a += ((uint32_t)
k[0])<<24;
649 a += ((uint32_t)
k[1])<<16;
650 a += ((uint32_t)
k[2])<<8;
651 a += ((uint32_t)
k[3]);
652 b += ((uint32_t)
k[4])<<24;
653 b += ((uint32_t)
k[5])<<16;
654 b += ((uint32_t)
k[6])<<8;
655 b += ((uint32_t)
k[7]);
656 c += ((uint32_t)
k[8])<<24;
657 c += ((uint32_t)
k[9])<<16;
658 c += ((uint32_t)
k[10])<<8;
659 c += ((uint32_t)
k[11]);
669 case 11:
c+=((uint32_t)
k[10])<<8;
670 case 10:
c+=((uint32_t)
k[9])<<16;
671 case 9 :
c+=((uint32_t)
k[8])<<24;
673 case 7 :
b+=((uint32_t)
k[6])<<8;
674 case 6 :
b+=((uint32_t)
k[5])<<16;
675 case 5 :
b+=((uint32_t)
k[4])<<24;
677 case 3 : a+=((uint32_t)
k[2])<<8;
678 case 2 : a+=((uint32_t)
k[1])<<16;
679 case 1 : a+=((uint32_t)
k[0])<<24;
703 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
704 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
721 const char * data_stream,
724 uint32_t crc = start_crc;
728 while (length-- > 0) {
732 crc = (crc >> 4) & 0x0FFF;
737 crc = (crc >> 4) & 0x0FFF;
747 uint32_t
GetCRC16 (
const char * data_stream,
int length) {
796 #define CRC32POLYNOMIAL 0x04c11db7L
802 for ( i = 0; i < 256; i++ ) {
803 crc_accum = ( (
unsigned long) i << 24 );
804 for ( j = 0; j < 8; j++ ) {
805 if ( crc_accum & 0x80000000L ) {
808 crc_accum = ( crc_accum << 1 );
821 const char *data_blk_ptr,
827 for (j = 0; j < data_blk_size; j++) {
828 i = (crc_accum >> 24) ^ *data_blk_ptr++;
829 crc_accum = (crc_accum << 8) ^
crc_table[i];
834 uint32_t
GetCRC32 (
const char * data_stream,
int length) {
843 uint32_t
GetCRC32PH (
const char *data_blk_ptr,
int data_blk_size) {
846 uint32_t crc_accum0 = 0, crc_accum1 = 0x23456789u;
848 if (data_blk_size & 1) crc_accum0 ^= *data_blk_ptr++;
849 for (j = 1; j < data_blk_size; j+=2) {
850 i0 = ((crc_accum0 >> 24) ^ *data_blk_ptr++);
851 i1 = ((crc_accum1 >> 24) ^ *data_blk_ptr++);
852 crc_accum0 = (crc_accum0 << 8) ^
crc_table[i0];
853 crc_accum1 = (crc_accum1 << 8) ^
crc_table[i1];
855 return crc_accum0 + crc_accum1;
864 uint32_t
FNVHash (
const char * data,
int len) {
869 for (i=0; i < len; i++) {
870 hash = (16777619u * hash) ^ data[i];
885 for (hash = 0, i = 0; i < len; i++) {
887 hash += (hash << 10);
891 hash ^= (hash >> 11);
892 hash += (hash << 15);
893 return (uint32_t) hash;
899 int32_t hash0 = 0, hash1 = 0x23456789;
902 if (len & 1) hash1 ^= *
s++;
904 for (i = 1; i < len; i+=2) {
907 hash0 += (hash0 << 10);
908 hash1 += (hash1 << 10);
909 hash0 ^= (hash0 >> 6);
910 hash1 ^= (hash1 >> 6);
915 hash0 += (hash0 << 3);
916 hash0 ^= (hash0 >> 11);
917 hash0 += (hash0 << 15);
918 return (uint32_t) hash0;
931 #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
932 || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
933 #define get16bits(d) (*((const uint16_t *) (d)))
937 #if !defined (get16bits)
938 #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
939 +(uint32_t)(((const uint8_t *)(d))[0]) )
946 if (len <= 0 || data == NULL)
return 0;
948 unsigned rem = len & 3;
952 for (;len > 0; len--) {
954 hash = (hash << 16) ^ ((
get16bits(data+2) << 11) ^ hash);
956 data += 2*
sizeof(uint16_t);
964 hash ^= data[
sizeof (uint16_t)] << 18;
974 case 1 : hash += *data;
999 for (
h = 0, i = 0; i < len; i++) {
1000 h = (
h << 5) + (
h * 5) + (
unsigned char)
s[i];
1009 for (
h = 0, i = 0; i < len; i++) {
1010 h = (
h << 5) +
h + (
unsigned char)
s[i];
1020 for (
int i=0; i < len; ++
s, ++i)
1022 h = (
h << 1) ^ (
unsigned char)
s[i];
1031 typedef uint32_t (*
hashFn) (
const char *
s,
int len);
1033 #define BUFF_SZ (128*2)
1034 #define NTESTS 5000000
1041 for (buff[0]=0, i=1; i <
BUFF_SZ; i++) buff[i] = (
char) (i + buff[i-1]);
1046 return (
c1 - c0)*(1.0 / (double)CLOCKS_PER_SEC);
1057 { 0.0,
"FNVHash\t\t",
FNVHash },
1071 for (i=0; i < 3; i++) {