xref: /aosp_15_r20/external/libnl/lib/hash.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * This code was taken from http://ccodearchive.net/info/hash.html
4*4dc78e53SAndroid Build Coastguard Worker  * The original file was modified to remove unwanted code
5*4dc78e53SAndroid Build Coastguard Worker  * and some changes to fit the current build environment
6*4dc78e53SAndroid Build Coastguard Worker  */
7*4dc78e53SAndroid Build Coastguard Worker /*
8*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
9*4dc78e53SAndroid Build Coastguard Worker lookup3.c, by Bob Jenkins, May 2006, Public Domain.
10*4dc78e53SAndroid Build Coastguard Worker 
11*4dc78e53SAndroid Build Coastguard Worker These are functions for producing 32-bit hashes for hash table lookup.
12*4dc78e53SAndroid Build Coastguard Worker hash_word(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
13*4dc78e53SAndroid Build Coastguard Worker are externally useful functions.  Routines to test the hash are included
14*4dc78e53SAndroid Build Coastguard Worker if SELF_TEST is defined.  You can use this free for any purpose.  It's in
15*4dc78e53SAndroid Build Coastguard Worker the public domain.  It has no warranty.
16*4dc78e53SAndroid Build Coastguard Worker 
17*4dc78e53SAndroid Build Coastguard Worker You probably want to use hashlittle().  hashlittle() and hashbig()
18*4dc78e53SAndroid Build Coastguard Worker hash byte arrays.  hashlittle() is is faster than hashbig() on
19*4dc78e53SAndroid Build Coastguard Worker little-endian machines.  Intel and AMD are little-endian machines.
20*4dc78e53SAndroid Build Coastguard Worker On second thought, you probably want hashlittle2(), which is identical to
21*4dc78e53SAndroid Build Coastguard Worker hashlittle() except it returns two 32-bit hashes for the price of one.
22*4dc78e53SAndroid Build Coastguard Worker You could implement hashbig2() if you wanted but I haven't bothered here.
23*4dc78e53SAndroid Build Coastguard Worker 
24*4dc78e53SAndroid Build Coastguard Worker If you want to find a hash of, say, exactly 7 integers, do
25*4dc78e53SAndroid Build Coastguard Worker   a = i1;  b = i2;  c = i3;
26*4dc78e53SAndroid Build Coastguard Worker   mix(a,b,c);
27*4dc78e53SAndroid Build Coastguard Worker   a += i4; b += i5; c += i6;
28*4dc78e53SAndroid Build Coastguard Worker   mix(a,b,c);
29*4dc78e53SAndroid Build Coastguard Worker   a += i7;
30*4dc78e53SAndroid Build Coastguard Worker   final(a,b,c);
31*4dc78e53SAndroid Build Coastguard Worker then use c as the hash value.  If you have a variable length array of
32*4dc78e53SAndroid Build Coastguard Worker 4-byte integers to hash, use hash_word().  If you have a byte array (like
33*4dc78e53SAndroid Build Coastguard Worker a character string), use hashlittle().  If you have several byte arrays, or
34*4dc78e53SAndroid Build Coastguard Worker a mix of things, see the comments above hashlittle().
35*4dc78e53SAndroid Build Coastguard Worker 
36*4dc78e53SAndroid Build Coastguard Worker Why is this so big?  I read 12 bytes at a time into 3 4-byte integers,
37*4dc78e53SAndroid Build Coastguard Worker then mix those integers.  This is fast (you can do a lot more thorough
38*4dc78e53SAndroid Build Coastguard Worker mixing with 12*3 instructions on 3 integers than you can with 3 instructions
39*4dc78e53SAndroid Build Coastguard Worker on 1 byte), but shoehorning those bytes into integers efficiently is messy.
40*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
41*4dc78e53SAndroid Build Coastguard Worker */
42*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
43*4dc78e53SAndroid Build Coastguard Worker 
44*4dc78e53SAndroid Build Coastguard Worker #include <netlink/hash.h>
45*4dc78e53SAndroid Build Coastguard Worker 
46*4dc78e53SAndroid Build Coastguard Worker #if HAVE_LITTLE_ENDIAN
47*4dc78e53SAndroid Build Coastguard Worker #define HASH_LITTLE_ENDIAN 1
48*4dc78e53SAndroid Build Coastguard Worker #define HASH_BIG_ENDIAN 0
49*4dc78e53SAndroid Build Coastguard Worker #elif HAVE_BIG_ENDIAN
50*4dc78e53SAndroid Build Coastguard Worker #define HASH_LITTLE_ENDIAN 0
51*4dc78e53SAndroid Build Coastguard Worker #define HASH_BIG_ENDIAN 1
52*4dc78e53SAndroid Build Coastguard Worker #else
53*4dc78e53SAndroid Build Coastguard Worker #error Unknown endian
54*4dc78e53SAndroid Build Coastguard Worker #endif
55*4dc78e53SAndroid Build Coastguard Worker 
56*4dc78e53SAndroid Build Coastguard Worker #define hashsize(n) ((uint32_t)1<<(n))
57*4dc78e53SAndroid Build Coastguard Worker #define hashmask(n) (hashsize(n)-1)
58*4dc78e53SAndroid Build Coastguard Worker #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
59*4dc78e53SAndroid Build Coastguard Worker 
60*4dc78e53SAndroid Build Coastguard Worker /*
61*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
62*4dc78e53SAndroid Build Coastguard Worker mix -- mix 3 32-bit values reversibly.
63*4dc78e53SAndroid Build Coastguard Worker 
64*4dc78e53SAndroid Build Coastguard Worker This is reversible, so any information in (a,b,c) before mix() is
65*4dc78e53SAndroid Build Coastguard Worker still in (a,b,c) after mix().
66*4dc78e53SAndroid Build Coastguard Worker 
67*4dc78e53SAndroid Build Coastguard Worker If four pairs of (a,b,c) inputs are run through mix(), or through
68*4dc78e53SAndroid Build Coastguard Worker mix() in reverse, there are at least 32 bits of the output that
69*4dc78e53SAndroid Build Coastguard Worker are sometimes the same for one pair and different for another pair.
70*4dc78e53SAndroid Build Coastguard Worker This was tested for:
71*4dc78e53SAndroid Build Coastguard Worker * pairs that differed by one bit, by two bits, in any combination
72*4dc78e53SAndroid Build Coastguard Worker   of top bits of (a,b,c), or in any combination of bottom bits of
73*4dc78e53SAndroid Build Coastguard Worker   (a,b,c).
74*4dc78e53SAndroid Build Coastguard Worker * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
75*4dc78e53SAndroid Build Coastguard Worker   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
76*4dc78e53SAndroid Build Coastguard Worker   is commonly produced by subtraction) look like a single 1-bit
77*4dc78e53SAndroid Build Coastguard Worker   difference.
78*4dc78e53SAndroid Build Coastguard Worker * the base values were pseudorandom, all zero but one bit set, or
79*4dc78e53SAndroid Build Coastguard Worker   all zero plus a counter that starts at zero.
80*4dc78e53SAndroid Build Coastguard Worker 
81*4dc78e53SAndroid Build Coastguard Worker Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
82*4dc78e53SAndroid Build Coastguard Worker satisfy this are
83*4dc78e53SAndroid Build Coastguard Worker     4  6  8 16 19  4
84*4dc78e53SAndroid Build Coastguard Worker     9 15  3 18 27 15
85*4dc78e53SAndroid Build Coastguard Worker    14  9  3  7 17  3
86*4dc78e53SAndroid Build Coastguard Worker Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
87*4dc78e53SAndroid Build Coastguard Worker for "differ" defined as + with a one-bit base and a two-bit delta.  I
88*4dc78e53SAndroid Build Coastguard Worker used http://burtleburtle.net/bob/hash/avalanche.html to choose
89*4dc78e53SAndroid Build Coastguard Worker the operations, constants, and arrangements of the variables.
90*4dc78e53SAndroid Build Coastguard Worker 
91*4dc78e53SAndroid Build Coastguard Worker This does not achieve avalanche.  There are input bits of (a,b,c)
92*4dc78e53SAndroid Build Coastguard Worker that fail to affect some output bits of (a,b,c), especially of a.  The
93*4dc78e53SAndroid Build Coastguard Worker most thoroughly mixed value is c, but it doesn't really even achieve
94*4dc78e53SAndroid Build Coastguard Worker avalanche in c.
95*4dc78e53SAndroid Build Coastguard Worker 
96*4dc78e53SAndroid Build Coastguard Worker This allows some parallelism.  Read-after-writes are good at doubling
97*4dc78e53SAndroid Build Coastguard Worker the number of bits affected, so the goal of mixing pulls in the opposite
98*4dc78e53SAndroid Build Coastguard Worker direction as the goal of parallelism.  I did what I could.  Rotates
99*4dc78e53SAndroid Build Coastguard Worker seem to cost as much as shifts on every machine I could lay my hands
100*4dc78e53SAndroid Build Coastguard Worker on, and rotates are much kinder to the top and bottom bits, so I used
101*4dc78e53SAndroid Build Coastguard Worker rotates.
102*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
103*4dc78e53SAndroid Build Coastguard Worker */
104*4dc78e53SAndroid Build Coastguard Worker #define mix(a,b,c) \
105*4dc78e53SAndroid Build Coastguard Worker { \
106*4dc78e53SAndroid Build Coastguard Worker   a -= c;  a ^= rot(c, 4);  c += b; \
107*4dc78e53SAndroid Build Coastguard Worker   b -= a;  b ^= rot(a, 6);  a += c; \
108*4dc78e53SAndroid Build Coastguard Worker   c -= b;  c ^= rot(b, 8);  b += a; \
109*4dc78e53SAndroid Build Coastguard Worker   a -= c;  a ^= rot(c,16);  c += b; \
110*4dc78e53SAndroid Build Coastguard Worker   b -= a;  b ^= rot(a,19);  a += c; \
111*4dc78e53SAndroid Build Coastguard Worker   c -= b;  c ^= rot(b, 4);  b += a; \
112*4dc78e53SAndroid Build Coastguard Worker }
113*4dc78e53SAndroid Build Coastguard Worker 
114*4dc78e53SAndroid Build Coastguard Worker /*
115*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
116*4dc78e53SAndroid Build Coastguard Worker final -- final mixing of 3 32-bit values (a,b,c) into c
117*4dc78e53SAndroid Build Coastguard Worker 
118*4dc78e53SAndroid Build Coastguard Worker Pairs of (a,b,c) values differing in only a few bits will usually
119*4dc78e53SAndroid Build Coastguard Worker produce values of c that look totally different.  This was tested for
120*4dc78e53SAndroid Build Coastguard Worker * pairs that differed by one bit, by two bits, in any combination
121*4dc78e53SAndroid Build Coastguard Worker   of top bits of (a,b,c), or in any combination of bottom bits of
122*4dc78e53SAndroid Build Coastguard Worker   (a,b,c).
123*4dc78e53SAndroid Build Coastguard Worker * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
124*4dc78e53SAndroid Build Coastguard Worker   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
125*4dc78e53SAndroid Build Coastguard Worker   is commonly produced by subtraction) look like a single 1-bit
126*4dc78e53SAndroid Build Coastguard Worker   difference.
127*4dc78e53SAndroid Build Coastguard Worker * the base values were pseudorandom, all zero but one bit set, or
128*4dc78e53SAndroid Build Coastguard Worker   all zero plus a counter that starts at zero.
129*4dc78e53SAndroid Build Coastguard Worker 
130*4dc78e53SAndroid Build Coastguard Worker These constants passed:
131*4dc78e53SAndroid Build Coastguard Worker  14 11 25 16 4 14 24
132*4dc78e53SAndroid Build Coastguard Worker  12 14 25 16 4 14 24
133*4dc78e53SAndroid Build Coastguard Worker and these came close:
134*4dc78e53SAndroid Build Coastguard Worker   4  8 15 26 3 22 24
135*4dc78e53SAndroid Build Coastguard Worker  10  8 15 26 3 22 24
136*4dc78e53SAndroid Build Coastguard Worker  11  8 15 26 3 22 24
137*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
138*4dc78e53SAndroid Build Coastguard Worker */
139*4dc78e53SAndroid Build Coastguard Worker #define final(a,b,c) \
140*4dc78e53SAndroid Build Coastguard Worker { \
141*4dc78e53SAndroid Build Coastguard Worker   c ^= b; c -= rot(b,14); \
142*4dc78e53SAndroid Build Coastguard Worker   a ^= c; a -= rot(c,11); \
143*4dc78e53SAndroid Build Coastguard Worker   b ^= a; b -= rot(a,25); \
144*4dc78e53SAndroid Build Coastguard Worker   c ^= b; c -= rot(b,16); \
145*4dc78e53SAndroid Build Coastguard Worker   a ^= c; a -= rot(c,4);  \
146*4dc78e53SAndroid Build Coastguard Worker   b ^= a; b -= rot(a,14); \
147*4dc78e53SAndroid Build Coastguard Worker   c ^= b; c -= rot(b,24); \
148*4dc78e53SAndroid Build Coastguard Worker }
149*4dc78e53SAndroid Build Coastguard Worker 
150*4dc78e53SAndroid Build Coastguard Worker /*
151*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
152*4dc78e53SAndroid Build Coastguard Worker hashlittle() -- hash a variable-length key into a 32-bit value
153*4dc78e53SAndroid Build Coastguard Worker   k       : the key (the unaligned variable-length array of bytes)
154*4dc78e53SAndroid Build Coastguard Worker   length  : the length of the key, counting by bytes
155*4dc78e53SAndroid Build Coastguard Worker   val2    : IN: can be any 4-byte value OUT: second 32 bit hash.
156*4dc78e53SAndroid Build Coastguard Worker Returns a 32-bit value.  Every bit of the key affects every bit of
157*4dc78e53SAndroid Build Coastguard Worker the return value.  Two keys differing by one or two bits will have
158*4dc78e53SAndroid Build Coastguard Worker totally different hash values.  Note that the return value is better
159*4dc78e53SAndroid Build Coastguard Worker mixed than val2, so use that first.
160*4dc78e53SAndroid Build Coastguard Worker 
161*4dc78e53SAndroid Build Coastguard Worker The best hash table sizes are powers of 2.  There is no need to do
162*4dc78e53SAndroid Build Coastguard Worker mod a prime (mod is sooo slow!).  If you need less than 32 bits,
163*4dc78e53SAndroid Build Coastguard Worker use a bitmask.  For example, if you need only 10 bits, do
164*4dc78e53SAndroid Build Coastguard Worker   h = (h & hashmask(10));
165*4dc78e53SAndroid Build Coastguard Worker In which case, the hash table should have hashsize(10) elements.
166*4dc78e53SAndroid Build Coastguard Worker 
167*4dc78e53SAndroid Build Coastguard Worker If you are hashing n strings (uint8_t **)k, do it like this:
168*4dc78e53SAndroid Build Coastguard Worker   for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
169*4dc78e53SAndroid Build Coastguard Worker 
170*4dc78e53SAndroid Build Coastguard Worker By Bob Jenkins, 2006.  [email protected].  You may use this
171*4dc78e53SAndroid Build Coastguard Worker code any way you wish, private, educational, or commercial.  It's free.
172*4dc78e53SAndroid Build Coastguard Worker 
173*4dc78e53SAndroid Build Coastguard Worker Use for hash table lookup, or anything where one collision in 2^^32 is
174*4dc78e53SAndroid Build Coastguard Worker acceptable.  Do NOT use for cryptographic purposes.
175*4dc78e53SAndroid Build Coastguard Worker -------------------------------------------------------------------------------
176*4dc78e53SAndroid Build Coastguard Worker */
177*4dc78e53SAndroid Build Coastguard Worker 
hashlittle(const void * key,size_t length,uint32_t * val2)178*4dc78e53SAndroid Build Coastguard Worker static uint32_t hashlittle( const void *key, size_t length, uint32_t *val2 )
179*4dc78e53SAndroid Build Coastguard Worker {
180*4dc78e53SAndroid Build Coastguard Worker   uint32_t a,b,c;                                          /* internal state */
181*4dc78e53SAndroid Build Coastguard Worker   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
182*4dc78e53SAndroid Build Coastguard Worker 
183*4dc78e53SAndroid Build Coastguard Worker   /* Set up the internal state */
184*4dc78e53SAndroid Build Coastguard Worker   a = b = c = 0xdeadbeef + ((uint32_t)length) + *val2;
185*4dc78e53SAndroid Build Coastguard Worker 
186*4dc78e53SAndroid Build Coastguard Worker   u.ptr = key;
187*4dc78e53SAndroid Build Coastguard Worker   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
188*4dc78e53SAndroid Build Coastguard Worker     const uint32_t *k = (const uint32_t *)key;         /* read 32-bit chunks */
189*4dc78e53SAndroid Build Coastguard Worker     const uint8_t  *k8;
190*4dc78e53SAndroid Build Coastguard Worker 
191*4dc78e53SAndroid Build Coastguard Worker     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
192*4dc78e53SAndroid Build Coastguard Worker     while (length > 12)
193*4dc78e53SAndroid Build Coastguard Worker     {
194*4dc78e53SAndroid Build Coastguard Worker       a += k[0];
195*4dc78e53SAndroid Build Coastguard Worker       b += k[1];
196*4dc78e53SAndroid Build Coastguard Worker       c += k[2];
197*4dc78e53SAndroid Build Coastguard Worker       mix(a,b,c);
198*4dc78e53SAndroid Build Coastguard Worker       length -= 12;
199*4dc78e53SAndroid Build Coastguard Worker       k += 3;
200*4dc78e53SAndroid Build Coastguard Worker     }
201*4dc78e53SAndroid Build Coastguard Worker 
202*4dc78e53SAndroid Build Coastguard Worker     /*----------------------------- handle the last (probably partial) block */
203*4dc78e53SAndroid Build Coastguard Worker     /*
204*4dc78e53SAndroid Build Coastguard Worker      * "k[2]&0xffffff" actually reads beyond the end of the string, but
205*4dc78e53SAndroid Build Coastguard Worker      * then masks off the part it's not allowed to read.  Because the
206*4dc78e53SAndroid Build Coastguard Worker      * string is aligned, the masked-off tail is in the same word as the
207*4dc78e53SAndroid Build Coastguard Worker      * rest of the string.  Every machine with memory protection I've seen
208*4dc78e53SAndroid Build Coastguard Worker      * does it on word boundaries, so is OK with this.  But VALGRIND will
209*4dc78e53SAndroid Build Coastguard Worker      * still catch it and complain.  The masking trick does make the hash
210*4dc78e53SAndroid Build Coastguard Worker      * noticably faster for short strings (like English words).
211*4dc78e53SAndroid Build Coastguard Worker      *
212*4dc78e53SAndroid Build Coastguard Worker      * Not on my testing with gcc 4.5 on an intel i5 CPU, at least --RR.
213*4dc78e53SAndroid Build Coastguard Worker      */
214*4dc78e53SAndroid Build Coastguard Worker #if 0
215*4dc78e53SAndroid Build Coastguard Worker     switch(length)
216*4dc78e53SAndroid Build Coastguard Worker     {
217*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
218*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
219*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
220*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
221*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[1]; a+=k[0]; break;
222*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
223*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=k[1]&0xffff; a+=k[0]; break;
224*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=k[1]&0xff; a+=k[0]; break;
225*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[0]; break;
226*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=k[0]&0xffffff; break;
227*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=k[0]&0xffff; break;
228*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=k[0]&0xff; break;
229*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;              /* zero length strings require no mixing */
230*4dc78e53SAndroid Build Coastguard Worker     }
231*4dc78e53SAndroid Build Coastguard Worker 
232*4dc78e53SAndroid Build Coastguard Worker #else /* make valgrind happy */
233*4dc78e53SAndroid Build Coastguard Worker 
234*4dc78e53SAndroid Build Coastguard Worker     k8 = (const uint8_t *)k;
235*4dc78e53SAndroid Build Coastguard Worker     switch(length)
236*4dc78e53SAndroid Build Coastguard Worker     {
237*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
238*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
239*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
240*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=k8[8];                   /* fall through */
241*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[1]; a+=k[0]; break;
242*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
243*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
244*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=k8[4];                   /* fall through */
245*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[0]; break;
246*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
247*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
248*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=k8[0]; break;
249*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;
250*4dc78e53SAndroid Build Coastguard Worker     }
251*4dc78e53SAndroid Build Coastguard Worker 
252*4dc78e53SAndroid Build Coastguard Worker #endif /* !valgrind */
253*4dc78e53SAndroid Build Coastguard Worker 
254*4dc78e53SAndroid Build Coastguard Worker   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
255*4dc78e53SAndroid Build Coastguard Worker     const uint16_t *k = (const uint16_t *)key;         /* read 16-bit chunks */
256*4dc78e53SAndroid Build Coastguard Worker     const uint8_t  *k8;
257*4dc78e53SAndroid Build Coastguard Worker 
258*4dc78e53SAndroid Build Coastguard Worker     /*--------------- all but last block: aligned reads and different mixing */
259*4dc78e53SAndroid Build Coastguard Worker     while (length > 12)
260*4dc78e53SAndroid Build Coastguard Worker     {
261*4dc78e53SAndroid Build Coastguard Worker       a += k[0] + (((uint32_t)k[1])<<16);
262*4dc78e53SAndroid Build Coastguard Worker       b += k[2] + (((uint32_t)k[3])<<16);
263*4dc78e53SAndroid Build Coastguard Worker       c += k[4] + (((uint32_t)k[5])<<16);
264*4dc78e53SAndroid Build Coastguard Worker       mix(a,b,c);
265*4dc78e53SAndroid Build Coastguard Worker       length -= 12;
266*4dc78e53SAndroid Build Coastguard Worker       k += 6;
267*4dc78e53SAndroid Build Coastguard Worker     }
268*4dc78e53SAndroid Build Coastguard Worker 
269*4dc78e53SAndroid Build Coastguard Worker     /*----------------------------- handle the last (probably partial) block */
270*4dc78e53SAndroid Build Coastguard Worker     k8 = (const uint8_t *)k;
271*4dc78e53SAndroid Build Coastguard Worker     switch(length)
272*4dc78e53SAndroid Build Coastguard Worker     {
273*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[4]+(((uint32_t)k[5])<<16);
274*4dc78e53SAndroid Build Coastguard Worker              b+=k[2]+(((uint32_t)k[3])<<16);
275*4dc78e53SAndroid Build Coastguard Worker              a+=k[0]+(((uint32_t)k[1])<<16);
276*4dc78e53SAndroid Build Coastguard Worker              break;
277*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=((uint32_t)k8[10])<<16;     /* fall through */
278*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=k[4];
279*4dc78e53SAndroid Build Coastguard Worker              b+=k[2]+(((uint32_t)k[3])<<16);
280*4dc78e53SAndroid Build Coastguard Worker              a+=k[0]+(((uint32_t)k[1])<<16);
281*4dc78e53SAndroid Build Coastguard Worker              break;
282*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=k8[8];                      /* fall through */
283*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
284*4dc78e53SAndroid Build Coastguard Worker              a+=k[0]+(((uint32_t)k[1])<<16);
285*4dc78e53SAndroid Build Coastguard Worker              break;
286*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=((uint32_t)k8[6])<<16;      /* fall through */
287*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=k[2];
288*4dc78e53SAndroid Build Coastguard Worker              a+=k[0]+(((uint32_t)k[1])<<16);
289*4dc78e53SAndroid Build Coastguard Worker              break;
290*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=k8[4];                      /* fall through */
291*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
292*4dc78e53SAndroid Build Coastguard Worker              break;
293*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=((uint32_t)k8[2])<<16;      /* fall through */
294*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=k[0];
295*4dc78e53SAndroid Build Coastguard Worker              break;
296*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=k8[0];
297*4dc78e53SAndroid Build Coastguard Worker              break;
298*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;                     /* zero length requires no mixing */
299*4dc78e53SAndroid Build Coastguard Worker     }
300*4dc78e53SAndroid Build Coastguard Worker 
301*4dc78e53SAndroid Build Coastguard Worker   } else {                        /* need to read the key one byte at a time */
302*4dc78e53SAndroid Build Coastguard Worker     const uint8_t *k = (const uint8_t *)key;
303*4dc78e53SAndroid Build Coastguard Worker 
304*4dc78e53SAndroid Build Coastguard Worker     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
305*4dc78e53SAndroid Build Coastguard Worker     while (length > 12)
306*4dc78e53SAndroid Build Coastguard Worker     {
307*4dc78e53SAndroid Build Coastguard Worker       a += k[0];
308*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[1])<<8;
309*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[2])<<16;
310*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[3])<<24;
311*4dc78e53SAndroid Build Coastguard Worker       b += k[4];
312*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[5])<<8;
313*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[6])<<16;
314*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[7])<<24;
315*4dc78e53SAndroid Build Coastguard Worker       c += k[8];
316*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[9])<<8;
317*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[10])<<16;
318*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[11])<<24;
319*4dc78e53SAndroid Build Coastguard Worker       mix(a,b,c);
320*4dc78e53SAndroid Build Coastguard Worker       length -= 12;
321*4dc78e53SAndroid Build Coastguard Worker       k += 12;
322*4dc78e53SAndroid Build Coastguard Worker     }
323*4dc78e53SAndroid Build Coastguard Worker 
324*4dc78e53SAndroid Build Coastguard Worker     /*-------------------------------- last block: affect all 32 bits of (c) */
325*4dc78e53SAndroid Build Coastguard Worker     switch(length)                   /* all the case statements fall through */
326*4dc78e53SAndroid Build Coastguard Worker     {
327*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=((uint32_t)k[11])<<24;  /* fall through */
328*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=((uint32_t)k[10])<<16;  /* fall through */
329*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=((uint32_t)k[9])<<8;    /* fall through */
330*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=k[8];                   /* fall through */
331*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=((uint32_t)k[7])<<24;   /* fall through */
332*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=((uint32_t)k[6])<<16;   /* fall through */
333*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=((uint32_t)k[5])<<8;    /* fall through */
334*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=k[4];                   /* fall through */
335*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=((uint32_t)k[3])<<24;   /* fall through */
336*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=((uint32_t)k[2])<<16;   /* fall through */
337*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=((uint32_t)k[1])<<8;    /* fall through */
338*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=k[0];
339*4dc78e53SAndroid Build Coastguard Worker              break;
340*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;
341*4dc78e53SAndroid Build Coastguard Worker     }
342*4dc78e53SAndroid Build Coastguard Worker   }
343*4dc78e53SAndroid Build Coastguard Worker 
344*4dc78e53SAndroid Build Coastguard Worker   final(a,b,c);
345*4dc78e53SAndroid Build Coastguard Worker   *val2 = b;
346*4dc78e53SAndroid Build Coastguard Worker   return c;
347*4dc78e53SAndroid Build Coastguard Worker }
348*4dc78e53SAndroid Build Coastguard Worker 
349*4dc78e53SAndroid Build Coastguard Worker /*
350*4dc78e53SAndroid Build Coastguard Worker  * hashbig():
351*4dc78e53SAndroid Build Coastguard Worker  * This is the same as hash_word() on big-endian machines.  It is different
352*4dc78e53SAndroid Build Coastguard Worker  * from hashlittle() on all machines.  hashbig() takes advantage of
353*4dc78e53SAndroid Build Coastguard Worker  * big-endian byte ordering.
354*4dc78e53SAndroid Build Coastguard Worker  */
hashbig(const void * key,size_t length,uint32_t * val2)355*4dc78e53SAndroid Build Coastguard Worker static uint32_t hashbig( const void *key, size_t length, uint32_t *val2)
356*4dc78e53SAndroid Build Coastguard Worker {
357*4dc78e53SAndroid Build Coastguard Worker   uint32_t a,b,c;
358*4dc78e53SAndroid Build Coastguard Worker   union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */
359*4dc78e53SAndroid Build Coastguard Worker 
360*4dc78e53SAndroid Build Coastguard Worker   /* Set up the internal state */
361*4dc78e53SAndroid Build Coastguard Worker   a = b = c = 0xdeadbeef + ((uint32_t)length) + *val2;
362*4dc78e53SAndroid Build Coastguard Worker 
363*4dc78e53SAndroid Build Coastguard Worker   u.ptr = key;
364*4dc78e53SAndroid Build Coastguard Worker   if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
365*4dc78e53SAndroid Build Coastguard Worker     const uint32_t *k = (const uint32_t *)key;         /* read 32-bit chunks */
366*4dc78e53SAndroid Build Coastguard Worker     const uint8_t  *k8;
367*4dc78e53SAndroid Build Coastguard Worker 
368*4dc78e53SAndroid Build Coastguard Worker     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
369*4dc78e53SAndroid Build Coastguard Worker     while (length > 12)
370*4dc78e53SAndroid Build Coastguard Worker     {
371*4dc78e53SAndroid Build Coastguard Worker       a += k[0];
372*4dc78e53SAndroid Build Coastguard Worker       b += k[1];
373*4dc78e53SAndroid Build Coastguard Worker       c += k[2];
374*4dc78e53SAndroid Build Coastguard Worker       mix(a,b,c);
375*4dc78e53SAndroid Build Coastguard Worker       length -= 12;
376*4dc78e53SAndroid Build Coastguard Worker       k += 3;
377*4dc78e53SAndroid Build Coastguard Worker     }
378*4dc78e53SAndroid Build Coastguard Worker 
379*4dc78e53SAndroid Build Coastguard Worker     /*----------------------------- handle the last (probably partial) block */
380*4dc78e53SAndroid Build Coastguard Worker     /*
381*4dc78e53SAndroid Build Coastguard Worker      * "k[2]<<8" actually reads beyond the end of the string, but
382*4dc78e53SAndroid Build Coastguard Worker      * then shifts out the part it's not allowed to read.  Because the
383*4dc78e53SAndroid Build Coastguard Worker      * string is aligned, the illegal read is in the same word as the
384*4dc78e53SAndroid Build Coastguard Worker      * rest of the string.  Every machine with memory protection I've seen
385*4dc78e53SAndroid Build Coastguard Worker      * does it on word boundaries, so is OK with this.  But VALGRIND will
386*4dc78e53SAndroid Build Coastguard Worker      * still catch it and complain.  The masking trick does make the hash
387*4dc78e53SAndroid Build Coastguard Worker      * noticably faster for short strings (like English words).
388*4dc78e53SAndroid Build Coastguard Worker      *
389*4dc78e53SAndroid Build Coastguard Worker      * Not on my testing with gcc 4.5 on an intel i5 CPU, at least --RR.
390*4dc78e53SAndroid Build Coastguard Worker      */
391*4dc78e53SAndroid Build Coastguard Worker #if 0
392*4dc78e53SAndroid Build Coastguard Worker     switch(length)
393*4dc78e53SAndroid Build Coastguard Worker     {
394*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
395*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0]; break;
396*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0]; break;
397*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0]; break;
398*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[1]; a+=k[0]; break;
399*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=k[1]&0xffffff00; a+=k[0]; break;
400*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=k[1]&0xffff0000; a+=k[0]; break;
401*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=k[1]&0xff000000; a+=k[0]; break;
402*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[0]; break;
403*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=k[0]&0xffffff00; break;
404*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=k[0]&0xffff0000; break;
405*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=k[0]&0xff000000; break;
406*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;              /* zero length strings require no mixing */
407*4dc78e53SAndroid Build Coastguard Worker     }
408*4dc78e53SAndroid Build Coastguard Worker 
409*4dc78e53SAndroid Build Coastguard Worker #else  /* make valgrind happy */
410*4dc78e53SAndroid Build Coastguard Worker 
411*4dc78e53SAndroid Build Coastguard Worker     k8 = (const uint8_t *)k;
412*4dc78e53SAndroid Build Coastguard Worker     switch(length)                   /* all the case statements fall through */
413*4dc78e53SAndroid Build Coastguard Worker     {
414*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
415*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=((uint32_t)k8[10])<<8;  /* fall through */
416*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=((uint32_t)k8[9])<<16;  /* fall through */
417*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=((uint32_t)k8[8])<<24;  /* fall through */
418*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[1]; a+=k[0]; break;
419*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=((uint32_t)k8[6])<<8;   /* fall through */
420*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=((uint32_t)k8[5])<<16;  /* fall through */
421*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=((uint32_t)k8[4])<<24;  /* fall through */
422*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[0]; break;
423*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=((uint32_t)k8[2])<<8;   /* fall through */
424*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=((uint32_t)k8[1])<<16;  /* fall through */
425*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=((uint32_t)k8[0])<<24; break;
426*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;
427*4dc78e53SAndroid Build Coastguard Worker     }
428*4dc78e53SAndroid Build Coastguard Worker 
429*4dc78e53SAndroid Build Coastguard Worker #endif /* !VALGRIND */
430*4dc78e53SAndroid Build Coastguard Worker 
431*4dc78e53SAndroid Build Coastguard Worker   } else {                        /* need to read the key one byte at a time */
432*4dc78e53SAndroid Build Coastguard Worker     const uint8_t *k = (const uint8_t *)key;
433*4dc78e53SAndroid Build Coastguard Worker 
434*4dc78e53SAndroid Build Coastguard Worker     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
435*4dc78e53SAndroid Build Coastguard Worker     while (length > 12)
436*4dc78e53SAndroid Build Coastguard Worker     {
437*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[0])<<24;
438*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[1])<<16;
439*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[2])<<8;
440*4dc78e53SAndroid Build Coastguard Worker       a += ((uint32_t)k[3]);
441*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[4])<<24;
442*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[5])<<16;
443*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[6])<<8;
444*4dc78e53SAndroid Build Coastguard Worker       b += ((uint32_t)k[7]);
445*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[8])<<24;
446*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[9])<<16;
447*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[10])<<8;
448*4dc78e53SAndroid Build Coastguard Worker       c += ((uint32_t)k[11]);
449*4dc78e53SAndroid Build Coastguard Worker       mix(a,b,c);
450*4dc78e53SAndroid Build Coastguard Worker       length -= 12;
451*4dc78e53SAndroid Build Coastguard Worker       k += 12;
452*4dc78e53SAndroid Build Coastguard Worker     }
453*4dc78e53SAndroid Build Coastguard Worker 
454*4dc78e53SAndroid Build Coastguard Worker     /*-------------------------------- last block: affect all 32 bits of (c) */
455*4dc78e53SAndroid Build Coastguard Worker     switch(length)                   /* all the case statements fall through */
456*4dc78e53SAndroid Build Coastguard Worker     {
457*4dc78e53SAndroid Build Coastguard Worker     case 12: c+=k[11];                  /* fall through */
458*4dc78e53SAndroid Build Coastguard Worker     case 11: c+=((uint32_t)k[10])<<8;   /* fall through */
459*4dc78e53SAndroid Build Coastguard Worker     case 10: c+=((uint32_t)k[9])<<16;   /* fall through */
460*4dc78e53SAndroid Build Coastguard Worker     case 9 : c+=((uint32_t)k[8])<<24;   /* fall through */
461*4dc78e53SAndroid Build Coastguard Worker     case 8 : b+=k[7];                   /* fall through */
462*4dc78e53SAndroid Build Coastguard Worker     case 7 : b+=((uint32_t)k[6])<<8;    /* fall through */
463*4dc78e53SAndroid Build Coastguard Worker     case 6 : b+=((uint32_t)k[5])<<16;   /* fall through */
464*4dc78e53SAndroid Build Coastguard Worker     case 5 : b+=((uint32_t)k[4])<<24;   /* fall through */
465*4dc78e53SAndroid Build Coastguard Worker     case 4 : a+=k[3];                   /* fall through */
466*4dc78e53SAndroid Build Coastguard Worker     case 3 : a+=((uint32_t)k[2])<<8;    /* fall through */
467*4dc78e53SAndroid Build Coastguard Worker     case 2 : a+=((uint32_t)k[1])<<16;   /* fall through */
468*4dc78e53SAndroid Build Coastguard Worker     case 1 : a+=((uint32_t)k[0])<<24;   /* fall through */
469*4dc78e53SAndroid Build Coastguard Worker              break;
470*4dc78e53SAndroid Build Coastguard Worker     case 0 : return c;
471*4dc78e53SAndroid Build Coastguard Worker     }
472*4dc78e53SAndroid Build Coastguard Worker   }
473*4dc78e53SAndroid Build Coastguard Worker 
474*4dc78e53SAndroid Build Coastguard Worker   final(a,b,c);
475*4dc78e53SAndroid Build Coastguard Worker   *val2 = b;
476*4dc78e53SAndroid Build Coastguard Worker   return c;
477*4dc78e53SAndroid Build Coastguard Worker }
478*4dc78e53SAndroid Build Coastguard Worker 
nl_hash_any(const void * key,size_t length,uint32_t base)479*4dc78e53SAndroid Build Coastguard Worker uint32_t nl_hash_any(const void *key, size_t length, uint32_t base)
480*4dc78e53SAndroid Build Coastguard Worker {
481*4dc78e53SAndroid Build Coastguard Worker 	if (HASH_BIG_ENDIAN)
482*4dc78e53SAndroid Build Coastguard Worker 		return hashbig(key, length, &base);
483*4dc78e53SAndroid Build Coastguard Worker 	else
484*4dc78e53SAndroid Build Coastguard Worker 		return hashlittle(key, length, &base);
485*4dc78e53SAndroid Build Coastguard Worker }
486