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