xref: /memcached-1.4.29/jenkins_hash.c (revision 81176472)
105ca809cSdormando /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
205ca809cSdormando /*
305ca809cSdormando  * Hash table
405ca809cSdormando  *
505ca809cSdormando  * The hash function used here is by Bob Jenkins, 1996:
605ca809cSdormando  *    <http://burtleburtle.net/bob/hash/doobs.html>
705ca809cSdormando  *       "By Bob Jenkins, 1996.  [email protected].
805ca809cSdormando  *       You may use this code any way you wish, private, educational,
905ca809cSdormando  *       or commercial.  It's free."
1005ca809cSdormando  *
1105ca809cSdormando  */
1205ca809cSdormando #include "memcached.h"
1305ca809cSdormando #include "jenkins_hash.h"
1405ca809cSdormando 
1505ca809cSdormando /*
1605ca809cSdormando  * Since the hash function does bit manipulation, it needs to know
1705ca809cSdormando  * whether it's big or little-endian. ENDIAN_LITTLE and ENDIAN_BIG
1805ca809cSdormando  * are set in the configure script.
1905ca809cSdormando  */
2005ca809cSdormando #if ENDIAN_BIG == 1
2105ca809cSdormando # define HASH_LITTLE_ENDIAN 0
2205ca809cSdormando # define HASH_BIG_ENDIAN 1
2305ca809cSdormando #else
2405ca809cSdormando # if ENDIAN_LITTLE == 1
2505ca809cSdormando #  define HASH_LITTLE_ENDIAN 1
2605ca809cSdormando #  define HASH_BIG_ENDIAN 0
2705ca809cSdormando # else
2805ca809cSdormando #  define HASH_LITTLE_ENDIAN 0
2905ca809cSdormando #  define HASH_BIG_ENDIAN 0
3005ca809cSdormando # endif
3105ca809cSdormando #endif
3205ca809cSdormando 
3305ca809cSdormando #define rot(x,k) (((x)<<(k)) ^ ((x)>>(32-(k))))
3405ca809cSdormando 
3505ca809cSdormando /*
3605ca809cSdormando -------------------------------------------------------------------------------
3705ca809cSdormando mix -- mix 3 32-bit values reversibly.
3805ca809cSdormando 
3905ca809cSdormando This is reversible, so any information in (a,b,c) before mix() is
4005ca809cSdormando still in (a,b,c) after mix().
4105ca809cSdormando 
4205ca809cSdormando If four pairs of (a,b,c) inputs are run through mix(), or through
4305ca809cSdormando mix() in reverse, there are at least 32 bits of the output that
4405ca809cSdormando are sometimes the same for one pair and different for another pair.
4505ca809cSdormando This was tested for:
4605ca809cSdormando * pairs that differed by one bit, by two bits, in any combination
4705ca809cSdormando   of top bits of (a,b,c), or in any combination of bottom bits of
4805ca809cSdormando   (a,b,c).
4905ca809cSdormando * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
5005ca809cSdormando   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
5105ca809cSdormando   is commonly produced by subtraction) look like a single 1-bit
5205ca809cSdormando   difference.
5305ca809cSdormando * the base values were pseudorandom, all zero but one bit set, or
5405ca809cSdormando   all zero plus a counter that starts at zero.
5505ca809cSdormando 
5605ca809cSdormando Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
5705ca809cSdormando satisfy this are
5805ca809cSdormando     4  6  8 16 19  4
5905ca809cSdormando     9 15  3 18 27 15
6005ca809cSdormando    14  9  3  7 17  3
6105ca809cSdormando Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
6205ca809cSdormando for "differ" defined as + with a one-bit base and a two-bit delta.  I
6305ca809cSdormando used http://burtleburtle.net/bob/hash/avalanche.html to choose
6405ca809cSdormando the operations, constants, and arrangements of the variables.
6505ca809cSdormando 
6605ca809cSdormando This does not achieve avalanche.  There are input bits of (a,b,c)
6705ca809cSdormando that fail to affect some output bits of (a,b,c), especially of a.  The
6805ca809cSdormando most thoroughly mixed value is c, but it doesn't really even achieve
6905ca809cSdormando avalanche in c.
7005ca809cSdormando 
7105ca809cSdormando This allows some parallelism.  Read-after-writes are good at doubling
7205ca809cSdormando the number of bits affected, so the goal of mixing pulls in the opposite
7305ca809cSdormando direction as the goal of parallelism.  I did what I could.  Rotates
7405ca809cSdormando seem to cost as much as shifts on every machine I could lay my hands
7505ca809cSdormando on, and rotates are much kinder to the top and bottom bits, so I used
7605ca809cSdormando rotates.
7705ca809cSdormando -------------------------------------------------------------------------------
7805ca809cSdormando */
7905ca809cSdormando #define mix(a,b,c) \
8005ca809cSdormando { \
8105ca809cSdormando   a -= c;  a ^= rot(c, 4);  c += b; \
8205ca809cSdormando   b -= a;  b ^= rot(a, 6);  a += c; \
8305ca809cSdormando   c -= b;  c ^= rot(b, 8);  b += a; \
8405ca809cSdormando   a -= c;  a ^= rot(c,16);  c += b; \
8505ca809cSdormando   b -= a;  b ^= rot(a,19);  a += c; \
8605ca809cSdormando   c -= b;  c ^= rot(b, 4);  b += a; \
8705ca809cSdormando }
8805ca809cSdormando 
8905ca809cSdormando /*
9005ca809cSdormando -------------------------------------------------------------------------------
9105ca809cSdormando final -- final mixing of 3 32-bit values (a,b,c) into c
9205ca809cSdormando 
9305ca809cSdormando Pairs of (a,b,c) values differing in only a few bits will usually
9405ca809cSdormando produce values of c that look totally different.  This was tested for
9505ca809cSdormando * pairs that differed by one bit, by two bits, in any combination
9605ca809cSdormando   of top bits of (a,b,c), or in any combination of bottom bits of
9705ca809cSdormando   (a,b,c).
9805ca809cSdormando * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
9905ca809cSdormando   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
10005ca809cSdormando   is commonly produced by subtraction) look like a single 1-bit
10105ca809cSdormando   difference.
10205ca809cSdormando * the base values were pseudorandom, all zero but one bit set, or
10305ca809cSdormando   all zero plus a counter that starts at zero.
10405ca809cSdormando 
10505ca809cSdormando These constants passed:
10605ca809cSdormando  14 11 25 16 4 14 24
10705ca809cSdormando  12 14 25 16 4 14 24
10805ca809cSdormando and these came close:
10905ca809cSdormando   4  8 15 26 3 22 24
11005ca809cSdormando  10  8 15 26 3 22 24
11105ca809cSdormando  11  8 15 26 3 22 24
11205ca809cSdormando -------------------------------------------------------------------------------
11305ca809cSdormando */
11405ca809cSdormando #define final(a,b,c) \
11505ca809cSdormando { \
11605ca809cSdormando   c ^= b; c -= rot(b,14); \
11705ca809cSdormando   a ^= c; a -= rot(c,11); \
11805ca809cSdormando   b ^= a; b -= rot(a,25); \
11905ca809cSdormando   c ^= b; c -= rot(b,16); \
12005ca809cSdormando   a ^= c; a -= rot(c,4);  \
12105ca809cSdormando   b ^= a; b -= rot(a,14); \
12205ca809cSdormando   c ^= b; c -= rot(b,24); \
12305ca809cSdormando }
12405ca809cSdormando 
12505ca809cSdormando #if HASH_LITTLE_ENDIAN == 1
jenkins_hash(const void * key,size_t length)12605ca809cSdormando uint32_t jenkins_hash(
12705ca809cSdormando   const void *key,       /* the key to hash */
12805ca809cSdormando   size_t      length)    /* length of the key */
12905ca809cSdormando {
13005ca809cSdormando   uint32_t a,b,c;                                          /* internal state */
13105ca809cSdormando   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
13205ca809cSdormando 
13305ca809cSdormando   /* Set up the internal state */
13405ca809cSdormando   a = b = c = 0xdeadbeef + ((uint32_t)length) + 0;
13505ca809cSdormando 
13605ca809cSdormando   u.ptr = key;
13705ca809cSdormando   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
13805ca809cSdormando     const uint32_t *k = key;                           /* read 32-bit chunks */
13905ca809cSdormando #ifdef VALGRIND
14005ca809cSdormando     const uint8_t  *k8;
14105ca809cSdormando #endif /* ifdef VALGRIND */
14205ca809cSdormando 
14305ca809cSdormando     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
14405ca809cSdormando     while (length > 12)
14505ca809cSdormando     {
14605ca809cSdormando       a += k[0];
14705ca809cSdormando       b += k[1];
14805ca809cSdormando       c += k[2];
14905ca809cSdormando       mix(a,b,c);
15005ca809cSdormando       length -= 12;
15105ca809cSdormando       k += 3;
15205ca809cSdormando     }
15305ca809cSdormando 
15405ca809cSdormando     /*----------------------------- handle the last (probably partial) block */
15505ca809cSdormando     /*
15605ca809cSdormando      * "k[2]&0xffffff" actually reads beyond the end of the string, but
15705ca809cSdormando      * then masks off the part it's not allowed to read.  Because the
15805ca809cSdormando      * string is aligned, the masked-off tail is in the same word as the
15905ca809cSdormando      * rest of the string.  Every machine with memory protection I've seen
16005ca809cSdormando      * does it on word boundaries, so is OK with this.  But VALGRIND will
16105ca809cSdormando      * still catch it and complain.  The masking trick does make the hash
162*81176472Sclark.kang      * noticeably faster for short strings (like English words).
16305ca809cSdormando      */
16405ca809cSdormando #ifndef VALGRIND
16505ca809cSdormando 
16605ca809cSdormando     switch(length)
16705ca809cSdormando     {
16805ca809cSdormando     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
16905ca809cSdormando     case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
17005ca809cSdormando     case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
17105ca809cSdormando     case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
17205ca809cSdormando     case 8 : b+=k[1]; a+=k[0]; break;
17305ca809cSdormando     case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
17405ca809cSdormando     case 6 : b+=k[1]&0xffff; a+=k[0]; break;
17505ca809cSdormando     case 5 : b+=k[1]&0xff; a+=k[0]; break;
17605ca809cSdormando     case 4 : a+=k[0]; break;
17705ca809cSdormando     case 3 : a+=k[0]&0xffffff; break;
17805ca809cSdormando     case 2 : a+=k[0]&0xffff; break;
17905ca809cSdormando     case 1 : a+=k[0]&0xff; break;
18005ca809cSdormando     case 0 : return c;  /* zero length strings require no mixing */
18105ca809cSdormando     }
18205ca809cSdormando 
18305ca809cSdormando #else /* make valgrind happy */
18405ca809cSdormando 
18505ca809cSdormando     k8 = (const uint8_t *)k;
18605ca809cSdormando     switch(length)
18705ca809cSdormando     {
18805ca809cSdormando     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
18905ca809cSdormando     case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
19005ca809cSdormando     case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
19105ca809cSdormando     case 9 : c+=k8[8];                   /* fall through */
19205ca809cSdormando     case 8 : b+=k[1]; a+=k[0]; break;
19305ca809cSdormando     case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
19405ca809cSdormando     case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
19505ca809cSdormando     case 5 : b+=k8[4];                   /* fall through */
19605ca809cSdormando     case 4 : a+=k[0]; break;
19705ca809cSdormando     case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
19805ca809cSdormando     case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
19905ca809cSdormando     case 1 : a+=k8[0]; break;
20005ca809cSdormando     case 0 : return c;  /* zero length strings require no mixing */
20105ca809cSdormando     }
20205ca809cSdormando 
20305ca809cSdormando #endif /* !valgrind */
20405ca809cSdormando 
20505ca809cSdormando   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
20605ca809cSdormando     const uint16_t *k = key;                           /* read 16-bit chunks */
20705ca809cSdormando     const uint8_t  *k8;
20805ca809cSdormando 
20905ca809cSdormando     /*--------------- all but last block: aligned reads and different mixing */
21005ca809cSdormando     while (length > 12)
21105ca809cSdormando     {
21205ca809cSdormando       a += k[0] + (((uint32_t)k[1])<<16);
21305ca809cSdormando       b += k[2] + (((uint32_t)k[3])<<16);
21405ca809cSdormando       c += k[4] + (((uint32_t)k[5])<<16);
21505ca809cSdormando       mix(a,b,c);
21605ca809cSdormando       length -= 12;
21705ca809cSdormando       k += 6;
21805ca809cSdormando     }
21905ca809cSdormando 
22005ca809cSdormando     /*----------------------------- handle the last (probably partial) block */
22105ca809cSdormando     k8 = (const uint8_t *)k;
22205ca809cSdormando     switch(length)
22305ca809cSdormando     {
22405ca809cSdormando     case 12: c+=k[4]+(((uint32_t)k[5])<<16);
22505ca809cSdormando              b+=k[2]+(((uint32_t)k[3])<<16);
22605ca809cSdormando              a+=k[0]+(((uint32_t)k[1])<<16);
22705ca809cSdormando              break;
22805ca809cSdormando     case 11: c+=((uint32_t)k8[10])<<16;     /* @fallthrough */
22905ca809cSdormando     case 10: c+=k[4];                       /* @fallthrough@ */
23005ca809cSdormando              b+=k[2]+(((uint32_t)k[3])<<16);
23105ca809cSdormando              a+=k[0]+(((uint32_t)k[1])<<16);
23205ca809cSdormando              break;
23305ca809cSdormando     case 9 : c+=k8[8];                      /* @fallthrough */
23405ca809cSdormando     case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
23505ca809cSdormando              a+=k[0]+(((uint32_t)k[1])<<16);
23605ca809cSdormando              break;
23705ca809cSdormando     case 7 : b+=((uint32_t)k8[6])<<16;      /* @fallthrough */
23805ca809cSdormando     case 6 : b+=k[2];
23905ca809cSdormando              a+=k[0]+(((uint32_t)k[1])<<16);
24005ca809cSdormando              break;
24105ca809cSdormando     case 5 : b+=k8[4];                      /* @fallthrough */
24205ca809cSdormando     case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
24305ca809cSdormando              break;
24405ca809cSdormando     case 3 : a+=((uint32_t)k8[2])<<16;      /* @fallthrough */
24505ca809cSdormando     case 2 : a+=k[0];
24605ca809cSdormando              break;
24705ca809cSdormando     case 1 : a+=k8[0];
24805ca809cSdormando              break;
24905ca809cSdormando     case 0 : return c;  /* zero length strings require no mixing */
25005ca809cSdormando     }
25105ca809cSdormando 
25205ca809cSdormando   } else {                        /* need to read the key one byte at a time */
25305ca809cSdormando     const uint8_t *k = key;
25405ca809cSdormando 
25505ca809cSdormando     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
25605ca809cSdormando     while (length > 12)
25705ca809cSdormando     {
25805ca809cSdormando       a += k[0];
25905ca809cSdormando       a += ((uint32_t)k[1])<<8;
26005ca809cSdormando       a += ((uint32_t)k[2])<<16;
26105ca809cSdormando       a += ((uint32_t)k[3])<<24;
26205ca809cSdormando       b += k[4];
26305ca809cSdormando       b += ((uint32_t)k[5])<<8;
26405ca809cSdormando       b += ((uint32_t)k[6])<<16;
26505ca809cSdormando       b += ((uint32_t)k[7])<<24;
26605ca809cSdormando       c += k[8];
26705ca809cSdormando       c += ((uint32_t)k[9])<<8;
26805ca809cSdormando       c += ((uint32_t)k[10])<<16;
26905ca809cSdormando       c += ((uint32_t)k[11])<<24;
27005ca809cSdormando       mix(a,b,c);
27105ca809cSdormando       length -= 12;
27205ca809cSdormando       k += 12;
27305ca809cSdormando     }
27405ca809cSdormando 
27505ca809cSdormando     /*-------------------------------- last block: affect all 32 bits of (c) */
27605ca809cSdormando     switch(length)                   /* all the case statements fall through */
27705ca809cSdormando     {
27805ca809cSdormando     case 12: c+=((uint32_t)k[11])<<24;
27905ca809cSdormando     case 11: c+=((uint32_t)k[10])<<16;
28005ca809cSdormando     case 10: c+=((uint32_t)k[9])<<8;
28105ca809cSdormando     case 9 : c+=k[8];
28205ca809cSdormando     case 8 : b+=((uint32_t)k[7])<<24;
28305ca809cSdormando     case 7 : b+=((uint32_t)k[6])<<16;
28405ca809cSdormando     case 6 : b+=((uint32_t)k[5])<<8;
28505ca809cSdormando     case 5 : b+=k[4];
28605ca809cSdormando     case 4 : a+=((uint32_t)k[3])<<24;
28705ca809cSdormando     case 3 : a+=((uint32_t)k[2])<<16;
28805ca809cSdormando     case 2 : a+=((uint32_t)k[1])<<8;
28905ca809cSdormando     case 1 : a+=k[0];
29005ca809cSdormando              break;
29105ca809cSdormando     case 0 : return c;  /* zero length strings require no mixing */
29205ca809cSdormando     }
29305ca809cSdormando   }
29405ca809cSdormando 
29505ca809cSdormando   final(a,b,c);
29605ca809cSdormando   return c;             /* zero length strings require no mixing */
29705ca809cSdormando }
29805ca809cSdormando 
29905ca809cSdormando #elif HASH_BIG_ENDIAN == 1
30005ca809cSdormando /*
30105ca809cSdormando  * hashbig():
30205ca809cSdormando  * This is the same as hashword() on big-endian machines.  It is different
30305ca809cSdormando  * from hashlittle() on all machines.  hashbig() takes advantage of
30405ca809cSdormando  * big-endian byte ordering.
30505ca809cSdormando  */
jenkins_hash(const void * key,size_t length)30605ca809cSdormando uint32_t jenkins_hash( const void *key, size_t length)
30705ca809cSdormando {
30805ca809cSdormando   uint32_t a,b,c;
30905ca809cSdormando   union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */
31005ca809cSdormando 
31105ca809cSdormando   /* Set up the internal state */
31205ca809cSdormando   a = b = c = 0xdeadbeef + ((uint32_t)length) + 0;
31305ca809cSdormando 
31405ca809cSdormando   u.ptr = key;
31505ca809cSdormando   if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
31605ca809cSdormando     const uint32_t *k = key;                           /* read 32-bit chunks */
31705ca809cSdormando #ifdef VALGRIND
31805ca809cSdormando     const uint8_t  *k8;
31905ca809cSdormando #endif /* ifdef VALGRIND */
32005ca809cSdormando 
32105ca809cSdormando     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
32205ca809cSdormando     while (length > 12)
32305ca809cSdormando     {
32405ca809cSdormando       a += k[0];
32505ca809cSdormando       b += k[1];
32605ca809cSdormando       c += k[2];
32705ca809cSdormando       mix(a,b,c);
32805ca809cSdormando       length -= 12;
32905ca809cSdormando       k += 3;
33005ca809cSdormando     }
33105ca809cSdormando 
33205ca809cSdormando     /*----------------------------- handle the last (probably partial) block */
33305ca809cSdormando     /*
33405ca809cSdormando      * "k[2]<<8" actually reads beyond the end of the string, but
33505ca809cSdormando      * then shifts out the part it's not allowed to read.  Because the
33605ca809cSdormando      * string is aligned, the illegal read is in the same word as the
33705ca809cSdormando      * rest of the string.  Every machine with memory protection I've seen
33805ca809cSdormando      * does it on word boundaries, so is OK with this.  But VALGRIND will
33905ca809cSdormando      * still catch it and complain.  The masking trick does make the hash
340*81176472Sclark.kang      * noticeably faster for short strings (like English words).
34105ca809cSdormando      */
34205ca809cSdormando #ifndef VALGRIND
34305ca809cSdormando 
34405ca809cSdormando     switch(length)
34505ca809cSdormando     {
34605ca809cSdormando     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
34705ca809cSdormando     case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0]; break;
34805ca809cSdormando     case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0]; break;
34905ca809cSdormando     case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0]; break;
35005ca809cSdormando     case 8 : b+=k[1]; a+=k[0]; break;
35105ca809cSdormando     case 7 : b+=k[1]&0xffffff00; a+=k[0]; break;
35205ca809cSdormando     case 6 : b+=k[1]&0xffff0000; a+=k[0]; break;
35305ca809cSdormando     case 5 : b+=k[1]&0xff000000; a+=k[0]; break;
35405ca809cSdormando     case 4 : a+=k[0]; break;
35505ca809cSdormando     case 3 : a+=k[0]&0xffffff00; break;
35605ca809cSdormando     case 2 : a+=k[0]&0xffff0000; break;
35705ca809cSdormando     case 1 : a+=k[0]&0xff000000; break;
35805ca809cSdormando     case 0 : return c;              /* zero length strings require no mixing */
35905ca809cSdormando     }
36005ca809cSdormando 
36105ca809cSdormando #else  /* make valgrind happy */
36205ca809cSdormando 
36305ca809cSdormando     k8 = (const uint8_t *)k;
36405ca809cSdormando     switch(length)                   /* all the case statements fall through */
36505ca809cSdormando     {
36605ca809cSdormando     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
36705ca809cSdormando     case 11: c+=((uint32_t)k8[10])<<8;  /* fall through */
36805ca809cSdormando     case 10: c+=((uint32_t)k8[9])<<16;  /* fall through */
36905ca809cSdormando     case 9 : c+=((uint32_t)k8[8])<<24;  /* fall through */
37005ca809cSdormando     case 8 : b+=k[1]; a+=k[0]; break;
37105ca809cSdormando     case 7 : b+=((uint32_t)k8[6])<<8;   /* fall through */
37205ca809cSdormando     case 6 : b+=((uint32_t)k8[5])<<16;  /* fall through */
37305ca809cSdormando     case 5 : b+=((uint32_t)k8[4])<<24;  /* fall through */
37405ca809cSdormando     case 4 : a+=k[0]; break;
37505ca809cSdormando     case 3 : a+=((uint32_t)k8[2])<<8;   /* fall through */
37605ca809cSdormando     case 2 : a+=((uint32_t)k8[1])<<16;  /* fall through */
37705ca809cSdormando     case 1 : a+=((uint32_t)k8[0])<<24; break;
37805ca809cSdormando     case 0 : return c;
37905ca809cSdormando     }
38005ca809cSdormando 
38105ca809cSdormando #endif /* !VALGRIND */
38205ca809cSdormando 
38305ca809cSdormando   } else {                        /* need to read the key one byte at a time */
38405ca809cSdormando     const uint8_t *k = key;
38505ca809cSdormando 
38605ca809cSdormando     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
38705ca809cSdormando     while (length > 12)
38805ca809cSdormando     {
38905ca809cSdormando       a += ((uint32_t)k[0])<<24;
39005ca809cSdormando       a += ((uint32_t)k[1])<<16;
39105ca809cSdormando       a += ((uint32_t)k[2])<<8;
39205ca809cSdormando       a += ((uint32_t)k[3]);
39305ca809cSdormando       b += ((uint32_t)k[4])<<24;
39405ca809cSdormando       b += ((uint32_t)k[5])<<16;
39505ca809cSdormando       b += ((uint32_t)k[6])<<8;
39605ca809cSdormando       b += ((uint32_t)k[7]);
39705ca809cSdormando       c += ((uint32_t)k[8])<<24;
39805ca809cSdormando       c += ((uint32_t)k[9])<<16;
39905ca809cSdormando       c += ((uint32_t)k[10])<<8;
40005ca809cSdormando       c += ((uint32_t)k[11]);
40105ca809cSdormando       mix(a,b,c);
40205ca809cSdormando       length -= 12;
40305ca809cSdormando       k += 12;
40405ca809cSdormando     }
40505ca809cSdormando 
40605ca809cSdormando     /*-------------------------------- last block: affect all 32 bits of (c) */
40705ca809cSdormando     switch(length)                   /* all the case statements fall through */
40805ca809cSdormando     {
40905ca809cSdormando     case 12: c+=k[11];
41005ca809cSdormando     case 11: c+=((uint32_t)k[10])<<8;
41105ca809cSdormando     case 10: c+=((uint32_t)k[9])<<16;
41205ca809cSdormando     case 9 : c+=((uint32_t)k[8])<<24;
41305ca809cSdormando     case 8 : b+=k[7];
41405ca809cSdormando     case 7 : b+=((uint32_t)k[6])<<8;
41505ca809cSdormando     case 6 : b+=((uint32_t)k[5])<<16;
41605ca809cSdormando     case 5 : b+=((uint32_t)k[4])<<24;
41705ca809cSdormando     case 4 : a+=k[3];
41805ca809cSdormando     case 3 : a+=((uint32_t)k[2])<<8;
41905ca809cSdormando     case 2 : a+=((uint32_t)k[1])<<16;
42005ca809cSdormando     case 1 : a+=((uint32_t)k[0])<<24;
42105ca809cSdormando              break;
42205ca809cSdormando     case 0 : return c;
42305ca809cSdormando     }
42405ca809cSdormando   }
42505ca809cSdormando 
42605ca809cSdormando   final(a,b,c);
42705ca809cSdormando   return c;
42805ca809cSdormando }
42905ca809cSdormando #else /* HASH_XXX_ENDIAN == 1 */
43005ca809cSdormando #error Must define HASH_BIG_ENDIAN or HASH_LITTLE_ENDIAN
43105ca809cSdormando #endif /* HASH_XXX_ENDIAN == 1 */
432