1*aca3beaaSApple OSS Distributions /*
2*aca3beaaSApple OSS Distributions * Copyright (c) 2011-2022 Apple Inc. All rights reserved.
3*aca3beaaSApple OSS Distributions *
4*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*aca3beaaSApple OSS Distributions *
6*aca3beaaSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*aca3beaaSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*aca3beaaSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*aca3beaaSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*aca3beaaSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*aca3beaaSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*aca3beaaSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*aca3beaaSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*aca3beaaSApple OSS Distributions *
15*aca3beaaSApple OSS Distributions * Please obtain a copy of the License at
16*aca3beaaSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*aca3beaaSApple OSS Distributions *
18*aca3beaaSApple OSS Distributions * The Original Code and all software distributed under the License are
19*aca3beaaSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*aca3beaaSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*aca3beaaSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*aca3beaaSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*aca3beaaSApple OSS Distributions * Please see the License for the specific language governing rights and
24*aca3beaaSApple OSS Distributions * limitations under the License.
25*aca3beaaSApple OSS Distributions *
26*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*aca3beaaSApple OSS Distributions */
28*aca3beaaSApple OSS Distributions
29*aca3beaaSApple OSS Distributions /*
30*aca3beaaSApple OSS Distributions * http://code.google.com/p/smhasher/
31*aca3beaaSApple OSS Distributions *
32*aca3beaaSApple OSS Distributions * Copyright (c) 2009-2011 Austin Appleby.
33*aca3beaaSApple OSS Distributions *
34*aca3beaaSApple OSS Distributions * MurmurHash3 was written by Austin Appleby, and is placed in the public
35*aca3beaaSApple OSS Distributions * domain. The author hereby disclaims copyright to this source code.
36*aca3beaaSApple OSS Distributions */
37*aca3beaaSApple OSS Distributions
38*aca3beaaSApple OSS Distributions /*
39*aca3beaaSApple OSS Distributions * http://burtleburtle.net/bob/hash/
40*aca3beaaSApple OSS Distributions *
41*aca3beaaSApple OSS Distributions * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
42*aca3beaaSApple OSS Distributions *
43*aca3beaaSApple OSS Distributions * You can use this free for any purpose. It's in the public domain.
44*aca3beaaSApple OSS Distributions * It has no warranty.
45*aca3beaaSApple OSS Distributions */
46*aca3beaaSApple OSS Distributions
47*aca3beaaSApple OSS Distributions #include <stdbool.h>
48*aca3beaaSApple OSS Distributions #include <sys/types.h>
49*aca3beaaSApple OSS Distributions #include <machine/endian.h>
50*aca3beaaSApple OSS Distributions #include <net/flowhash.h>
51*aca3beaaSApple OSS Distributions #include <os/base.h>
52*aca3beaaSApple OSS Distributions
53*aca3beaaSApple OSS Distributions static inline u_int32_t getblock32(const u_int32_t *, int);
54*aca3beaaSApple OSS Distributions static inline u_int64_t getblock64(const u_int64_t *, int);
55*aca3beaaSApple OSS Distributions static inline u_int32_t mh3_fmix32(u_int32_t);
56*aca3beaaSApple OSS Distributions static inline u_int64_t mh3_fmix64(u_int64_t);
57*aca3beaaSApple OSS Distributions
58*aca3beaaSApple OSS Distributions #define ALIGNED16(v) ((((uintptr_t)(v)) & 1) == 0)
59*aca3beaaSApple OSS Distributions #define ALIGNED32(v) ((((uintptr_t)(v)) & 3) == 0)
60*aca3beaaSApple OSS Distributions #define ALIGNED64(v) ((((uintptr_t)(v)) & 7) == 0)
61*aca3beaaSApple OSS Distributions
62*aca3beaaSApple OSS Distributions #define ROTL32(x, r) (((x) << (r)) | ((x) >> (32 - (r))))
63*aca3beaaSApple OSS Distributions #define ROTL64(x, r) (((x) << (r)) | ((x) >> (64 - (r))))
64*aca3beaaSApple OSS Distributions
65*aca3beaaSApple OSS Distributions /*
66*aca3beaaSApple OSS Distributions * The following hash algorithms are selected based on performance:
67*aca3beaaSApple OSS Distributions *
68*aca3beaaSApple OSS Distributions * 64-bit: MurmurHash3_x64_128
69*aca3beaaSApple OSS Distributions * 32-bit: JHash
70*aca3beaaSApple OSS Distributions */
71*aca3beaaSApple OSS Distributions #if defined(__LP64__)
72*aca3beaaSApple OSS Distributions net_flowhash_fn_t *net_flowhash = net_flowhash_mh3_x64_128;
73*aca3beaaSApple OSS Distributions #else /* !__LP64__ */
74*aca3beaaSApple OSS Distributions net_flowhash_fn_t *net_flowhash = net_flowhash_jhash;
75*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
76*aca3beaaSApple OSS Distributions
77*aca3beaaSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__) || defined(__arm64__)
78*aca3beaaSApple OSS Distributions static inline u_int32_t
getblock32(const u_int32_t * p,int i)79*aca3beaaSApple OSS Distributions getblock32(const u_int32_t *p, int i)
80*aca3beaaSApple OSS Distributions {
81*aca3beaaSApple OSS Distributions return p[i];
82*aca3beaaSApple OSS Distributions }
83*aca3beaaSApple OSS Distributions
84*aca3beaaSApple OSS Distributions static inline u_int64_t
getblock64(const u_int64_t * p,int i)85*aca3beaaSApple OSS Distributions getblock64(const u_int64_t *p, int i)
86*aca3beaaSApple OSS Distributions {
87*aca3beaaSApple OSS Distributions return p[i];
88*aca3beaaSApple OSS Distributions }
89*aca3beaaSApple OSS Distributions #else /* !__i386__ && !__x86_64__ && !__arm64__*/
90*aca3beaaSApple OSS Distributions static inline u_int32_t
getblock32(const u_int32_t * p,int i)91*aca3beaaSApple OSS Distributions getblock32(const u_int32_t *p, int i)
92*aca3beaaSApple OSS Distributions {
93*aca3beaaSApple OSS Distributions const u_int8_t *bytes = (u_int8_t *)(void *)(uintptr_t)(p + i);
94*aca3beaaSApple OSS Distributions u_int32_t value;
95*aca3beaaSApple OSS Distributions
96*aca3beaaSApple OSS Distributions if (ALIGNED32(p)) {
97*aca3beaaSApple OSS Distributions value = p[i];
98*aca3beaaSApple OSS Distributions } else {
99*aca3beaaSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
100*aca3beaaSApple OSS Distributions value =
101*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[0]) << 24) |
102*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[1]) << 16) |
103*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[2]) << 8) |
104*aca3beaaSApple OSS Distributions ((u_int32_t)bytes[3]);
105*aca3beaaSApple OSS Distributions #else /* LITTLE_ENDIAN */
106*aca3beaaSApple OSS Distributions value =
107*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[3]) << 24) |
108*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[2]) << 16) |
109*aca3beaaSApple OSS Distributions (((u_int32_t)bytes[1]) << 8) |
110*aca3beaaSApple OSS Distributions ((u_int32_t)bytes[0]);
111*aca3beaaSApple OSS Distributions #endif /* LITTLE_ENDIAN */
112*aca3beaaSApple OSS Distributions }
113*aca3beaaSApple OSS Distributions return value;
114*aca3beaaSApple OSS Distributions }
115*aca3beaaSApple OSS Distributions
116*aca3beaaSApple OSS Distributions static inline u_int64_t
getblock64(const u_int64_t * p,int i)117*aca3beaaSApple OSS Distributions getblock64(const u_int64_t *p, int i)
118*aca3beaaSApple OSS Distributions {
119*aca3beaaSApple OSS Distributions const u_int8_t *bytes = (const u_int8_t *)(void *)(uintptr_t)(p + i);
120*aca3beaaSApple OSS Distributions u_int64_t value;
121*aca3beaaSApple OSS Distributions
122*aca3beaaSApple OSS Distributions if (ALIGNED64(p)) {
123*aca3beaaSApple OSS Distributions value = p[i];
124*aca3beaaSApple OSS Distributions } else {
125*aca3beaaSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
126*aca3beaaSApple OSS Distributions value =
127*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[0]) << 56) |
128*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[1]) << 48) |
129*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[2]) << 40) |
130*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[3]) << 32) |
131*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[4]) << 24) |
132*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[5]) << 16) |
133*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[6]) << 8) |
134*aca3beaaSApple OSS Distributions ((u_int64_t)bytes[7]);
135*aca3beaaSApple OSS Distributions #else /* LITTLE_ENDIAN */
136*aca3beaaSApple OSS Distributions value =
137*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[7]) << 56) |
138*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[6]) << 48) |
139*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[5]) << 40) |
140*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[4]) << 32) |
141*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[3]) << 24) |
142*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[2]) << 16) |
143*aca3beaaSApple OSS Distributions (((u_int64_t)bytes[1]) << 8) |
144*aca3beaaSApple OSS Distributions ((u_int64_t)bytes[0]);
145*aca3beaaSApple OSS Distributions #endif /* LITTLE_ENDIAN */
146*aca3beaaSApple OSS Distributions }
147*aca3beaaSApple OSS Distributions return value;
148*aca3beaaSApple OSS Distributions }
149*aca3beaaSApple OSS Distributions #endif /* !__i386__ && !__x86_64 && !__arm64__ */
150*aca3beaaSApple OSS Distributions
151*aca3beaaSApple OSS Distributions static inline u_int32_t
mh3_fmix32(u_int32_t h)152*aca3beaaSApple OSS Distributions mh3_fmix32(u_int32_t h)
153*aca3beaaSApple OSS Distributions {
154*aca3beaaSApple OSS Distributions h ^= h >> 16;
155*aca3beaaSApple OSS Distributions h *= 0x85ebca6b;
156*aca3beaaSApple OSS Distributions h ^= h >> 13;
157*aca3beaaSApple OSS Distributions h *= 0xc2b2ae35;
158*aca3beaaSApple OSS Distributions h ^= h >> 16;
159*aca3beaaSApple OSS Distributions
160*aca3beaaSApple OSS Distributions return h;
161*aca3beaaSApple OSS Distributions }
162*aca3beaaSApple OSS Distributions
163*aca3beaaSApple OSS Distributions static inline u_int64_t
mh3_fmix64(u_int64_t k)164*aca3beaaSApple OSS Distributions mh3_fmix64(u_int64_t k)
165*aca3beaaSApple OSS Distributions {
166*aca3beaaSApple OSS Distributions k ^= k >> 33;
167*aca3beaaSApple OSS Distributions k *= 0xff51afd7ed558ccdLLU;
168*aca3beaaSApple OSS Distributions k ^= k >> 33;
169*aca3beaaSApple OSS Distributions k *= 0xc4ceb9fe1a85ec53LLU;
170*aca3beaaSApple OSS Distributions k ^= k >> 33;
171*aca3beaaSApple OSS Distributions
172*aca3beaaSApple OSS Distributions return k;
173*aca3beaaSApple OSS Distributions }
174*aca3beaaSApple OSS Distributions
175*aca3beaaSApple OSS Distributions /*
176*aca3beaaSApple OSS Distributions * MurmurHash3_x86_32
177*aca3beaaSApple OSS Distributions */
178*aca3beaaSApple OSS Distributions #define MH3_X86_32_C1 0xcc9e2d51
179*aca3beaaSApple OSS Distributions #define MH3_X86_32_C2 0x1b873593
180*aca3beaaSApple OSS Distributions
181*aca3beaaSApple OSS Distributions u_int32_t
net_flowhash_mh3_x86_32(const void * key,u_int32_t len,const u_int32_t seed)182*aca3beaaSApple OSS Distributions net_flowhash_mh3_x86_32(const void *key, u_int32_t len, const u_int32_t seed)
183*aca3beaaSApple OSS Distributions {
184*aca3beaaSApple OSS Distributions const u_int8_t *data = (const u_int8_t *)key;
185*aca3beaaSApple OSS Distributions const u_int32_t nblocks = len / 4;
186*aca3beaaSApple OSS Distributions const u_int32_t *blocks;
187*aca3beaaSApple OSS Distributions const u_int8_t *tail;
188*aca3beaaSApple OSS Distributions u_int32_t h1 = seed, k1;
189*aca3beaaSApple OSS Distributions int i;
190*aca3beaaSApple OSS Distributions
191*aca3beaaSApple OSS Distributions /* body */
192*aca3beaaSApple OSS Distributions blocks = (const u_int32_t *)(const void *)(data + nblocks * 4);
193*aca3beaaSApple OSS Distributions
194*aca3beaaSApple OSS Distributions for (i = -nblocks; i; i++) {
195*aca3beaaSApple OSS Distributions k1 = getblock32(blocks, i);
196*aca3beaaSApple OSS Distributions
197*aca3beaaSApple OSS Distributions k1 *= MH3_X86_32_C1;
198*aca3beaaSApple OSS Distributions k1 = ROTL32(k1, 15);
199*aca3beaaSApple OSS Distributions k1 *= MH3_X86_32_C2;
200*aca3beaaSApple OSS Distributions
201*aca3beaaSApple OSS Distributions h1 ^= k1;
202*aca3beaaSApple OSS Distributions h1 = ROTL32(h1, 13);
203*aca3beaaSApple OSS Distributions h1 = h1 * 5 + 0xe6546b64;
204*aca3beaaSApple OSS Distributions }
205*aca3beaaSApple OSS Distributions
206*aca3beaaSApple OSS Distributions /* tail */
207*aca3beaaSApple OSS Distributions tail = (const u_int8_t *)(const void *)(data + nblocks * 4);
208*aca3beaaSApple OSS Distributions k1 = 0;
209*aca3beaaSApple OSS Distributions
210*aca3beaaSApple OSS Distributions switch (len & 3) {
211*aca3beaaSApple OSS Distributions case 3:
212*aca3beaaSApple OSS Distributions k1 ^= tail[2] << 16;
213*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
214*aca3beaaSApple OSS Distributions case 2:
215*aca3beaaSApple OSS Distributions k1 ^= tail[1] << 8;
216*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
217*aca3beaaSApple OSS Distributions case 1:
218*aca3beaaSApple OSS Distributions k1 ^= tail[0];
219*aca3beaaSApple OSS Distributions k1 *= MH3_X86_32_C1;
220*aca3beaaSApple OSS Distributions k1 = ROTL32(k1, 15);
221*aca3beaaSApple OSS Distributions k1 *= MH3_X86_32_C2;
222*aca3beaaSApple OSS Distributions h1 ^= k1;
223*aca3beaaSApple OSS Distributions }
224*aca3beaaSApple OSS Distributions ;
225*aca3beaaSApple OSS Distributions
226*aca3beaaSApple OSS Distributions /* finalization */
227*aca3beaaSApple OSS Distributions h1 ^= len;
228*aca3beaaSApple OSS Distributions
229*aca3beaaSApple OSS Distributions h1 = mh3_fmix32(h1);
230*aca3beaaSApple OSS Distributions
231*aca3beaaSApple OSS Distributions return h1;
232*aca3beaaSApple OSS Distributions }
233*aca3beaaSApple OSS Distributions
234*aca3beaaSApple OSS Distributions /*
235*aca3beaaSApple OSS Distributions * MurmurHash3_x64_128
236*aca3beaaSApple OSS Distributions */
237*aca3beaaSApple OSS Distributions #define MH3_X64_128_C1 0x87c37b91114253d5LLU
238*aca3beaaSApple OSS Distributions #define MH3_X64_128_C2 0x4cf5ad432745937fLLU
239*aca3beaaSApple OSS Distributions
240*aca3beaaSApple OSS Distributions u_int32_t
net_flowhash_mh3_x64_128(const void * key,u_int32_t len,const u_int32_t seed)241*aca3beaaSApple OSS Distributions net_flowhash_mh3_x64_128(const void *key, u_int32_t len, const u_int32_t seed)
242*aca3beaaSApple OSS Distributions {
243*aca3beaaSApple OSS Distributions const u_int8_t *data = (const u_int8_t *)key;
244*aca3beaaSApple OSS Distributions const u_int32_t nblocks = len / 16;
245*aca3beaaSApple OSS Distributions const u_int64_t *blocks;
246*aca3beaaSApple OSS Distributions const u_int8_t *tail;
247*aca3beaaSApple OSS Distributions u_int64_t h1 = seed, k1;
248*aca3beaaSApple OSS Distributions u_int64_t h2 = seed, k2;
249*aca3beaaSApple OSS Distributions u_int32_t i;
250*aca3beaaSApple OSS Distributions
251*aca3beaaSApple OSS Distributions /* body */
252*aca3beaaSApple OSS Distributions blocks = (const u_int64_t *)(const void *)data;
253*aca3beaaSApple OSS Distributions
254*aca3beaaSApple OSS Distributions for (i = 0; i < nblocks; i++) {
255*aca3beaaSApple OSS Distributions k1 = getblock64(blocks, i * 2 + 0);
256*aca3beaaSApple OSS Distributions k2 = getblock64(blocks, i * 2 + 1);
257*aca3beaaSApple OSS Distributions
258*aca3beaaSApple OSS Distributions k1 *= MH3_X64_128_C1;
259*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
260*aca3beaaSApple OSS Distributions __asm__ ( "rol $31, %[k1]\n\t" :[k1] "+r" (k1) : :);
261*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
262*aca3beaaSApple OSS Distributions __asm__ ( "ror %[k1], %[k1], #(64-31)\n\t" :[k1] "+r" (k1) : :);
263*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
264*aca3beaaSApple OSS Distributions k1 = ROTL64(k1, 31);
265*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
266*aca3beaaSApple OSS Distributions k1 *= MH3_X64_128_C2;
267*aca3beaaSApple OSS Distributions h1 ^= k1;
268*aca3beaaSApple OSS Distributions
269*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
270*aca3beaaSApple OSS Distributions __asm__ ( "rol $27, %[h1]\n\t" :[h1] "+r" (h1) : :);
271*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
272*aca3beaaSApple OSS Distributions __asm__ ( "ror %[h1], %[h1], #(64-27)\n\t" :[h1] "+r" (h1) : :);
273*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
274*aca3beaaSApple OSS Distributions h1 = ROTL64(h1, 27);
275*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
276*aca3beaaSApple OSS Distributions h1 += h2;
277*aca3beaaSApple OSS Distributions h1 = h1 * 5 + 0x52dce729;
278*aca3beaaSApple OSS Distributions
279*aca3beaaSApple OSS Distributions k2 *= MH3_X64_128_C2;
280*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
281*aca3beaaSApple OSS Distributions __asm__ ( "rol $33, %[k2]\n\t" :[k2] "+r" (k2) : :);
282*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
283*aca3beaaSApple OSS Distributions __asm__ ( "ror %[k2], %[k2], #(64-33)\n\t" :[k2] "+r" (k2) : :);
284*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
285*aca3beaaSApple OSS Distributions k2 = ROTL64(k2, 33);
286*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
287*aca3beaaSApple OSS Distributions k2 *= MH3_X64_128_C1;
288*aca3beaaSApple OSS Distributions h2 ^= k2;
289*aca3beaaSApple OSS Distributions
290*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
291*aca3beaaSApple OSS Distributions __asm__ ( "rol $31, %[h2]\n\t" :[h2] "+r" (h2) : :);
292*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
293*aca3beaaSApple OSS Distributions __asm__ ( "ror %[h2], %[h2], #(64-31)\n\t" :[h2] "+r" (h2) : :);
294*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
295*aca3beaaSApple OSS Distributions h2 = ROTL64(h2, 31);
296*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
297*aca3beaaSApple OSS Distributions h2 += h1;
298*aca3beaaSApple OSS Distributions h2 = h2 * 5 + 0x38495ab5;
299*aca3beaaSApple OSS Distributions }
300*aca3beaaSApple OSS Distributions
301*aca3beaaSApple OSS Distributions /* tail */
302*aca3beaaSApple OSS Distributions tail = (const u_int8_t *)(const void *)(data + nblocks * 16);
303*aca3beaaSApple OSS Distributions k1 = 0;
304*aca3beaaSApple OSS Distributions k2 = 0;
305*aca3beaaSApple OSS Distributions
306*aca3beaaSApple OSS Distributions switch (len & 15) {
307*aca3beaaSApple OSS Distributions case 15:
308*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[14]) << 48;
309*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
310*aca3beaaSApple OSS Distributions case 14:
311*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[13]) << 40;
312*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
313*aca3beaaSApple OSS Distributions case 13:
314*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[12]) << 32;
315*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
316*aca3beaaSApple OSS Distributions case 12:
317*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[11]) << 24;
318*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
319*aca3beaaSApple OSS Distributions case 11:
320*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[10]) << 16;
321*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
322*aca3beaaSApple OSS Distributions case 10:
323*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[9]) << 8;
324*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
325*aca3beaaSApple OSS Distributions case 9:
326*aca3beaaSApple OSS Distributions k2 ^= ((u_int64_t)tail[8]) << 0;
327*aca3beaaSApple OSS Distributions k2 *= MH3_X64_128_C2;
328*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
329*aca3beaaSApple OSS Distributions __asm__ ( "rol $33, %[k2]\n\t" :[k2] "+r" (k2) : :);
330*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
331*aca3beaaSApple OSS Distributions __asm__ ( "ror %[k2], %[k2], #(64-33)\n\t" :[k2] "+r" (k2) : :);
332*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
333*aca3beaaSApple OSS Distributions k2 = ROTL64(k2, 33);
334*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
335*aca3beaaSApple OSS Distributions k2 *= MH3_X64_128_C1;
336*aca3beaaSApple OSS Distributions h2 ^= k2;
337*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
338*aca3beaaSApple OSS Distributions case 8:
339*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[7]) << 56;
340*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
341*aca3beaaSApple OSS Distributions case 7:
342*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[6]) << 48;
343*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
344*aca3beaaSApple OSS Distributions case 6:
345*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[5]) << 40;
346*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
347*aca3beaaSApple OSS Distributions case 5:
348*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[4]) << 32;
349*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
350*aca3beaaSApple OSS Distributions case 4:
351*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[3]) << 24;
352*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
353*aca3beaaSApple OSS Distributions case 3:
354*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[2]) << 16;
355*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
356*aca3beaaSApple OSS Distributions case 2:
357*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[1]) << 8;
358*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
359*aca3beaaSApple OSS Distributions case 1:
360*aca3beaaSApple OSS Distributions k1 ^= ((u_int64_t)tail[0]) << 0;
361*aca3beaaSApple OSS Distributions k1 *= MH3_X64_128_C1;
362*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
363*aca3beaaSApple OSS Distributions __asm__ ( "rol $31, %[k1]\n\t" :[k1] "+r" (k1) : :);
364*aca3beaaSApple OSS Distributions #elif defined(__arm64__)
365*aca3beaaSApple OSS Distributions __asm__ ( "ror %[k1], %[k1], #(64-31)\n\t" :[k1] "+r" (k1) : :);
366*aca3beaaSApple OSS Distributions #else /* !__x86_64__ && !__arm64__ */
367*aca3beaaSApple OSS Distributions k1 = ROTL64(k1, 31);
368*aca3beaaSApple OSS Distributions #endif /* !__x86_64__ && !__arm64__ */
369*aca3beaaSApple OSS Distributions k1 *= MH3_X64_128_C2;
370*aca3beaaSApple OSS Distributions h1 ^= k1;
371*aca3beaaSApple OSS Distributions }
372*aca3beaaSApple OSS Distributions ;
373*aca3beaaSApple OSS Distributions
374*aca3beaaSApple OSS Distributions /* finalization */
375*aca3beaaSApple OSS Distributions h1 ^= len;
376*aca3beaaSApple OSS Distributions h2 ^= len;
377*aca3beaaSApple OSS Distributions
378*aca3beaaSApple OSS Distributions h1 += h2;
379*aca3beaaSApple OSS Distributions h2 += h1;
380*aca3beaaSApple OSS Distributions
381*aca3beaaSApple OSS Distributions h1 = mh3_fmix64(h1);
382*aca3beaaSApple OSS Distributions h2 = mh3_fmix64(h2);
383*aca3beaaSApple OSS Distributions
384*aca3beaaSApple OSS Distributions h1 += h2;
385*aca3beaaSApple OSS Distributions h2 += h1;
386*aca3beaaSApple OSS Distributions
387*aca3beaaSApple OSS Distributions /* throw all but lowest 32-bit */
388*aca3beaaSApple OSS Distributions return h1 & 0xffffffff;
389*aca3beaaSApple OSS Distributions }
390*aca3beaaSApple OSS Distributions
391*aca3beaaSApple OSS Distributions #define JHASH_INIT 0xdeadbeef
392*aca3beaaSApple OSS Distributions
393*aca3beaaSApple OSS Distributions #define JHASH_MIX(a, b, c) { \
394*aca3beaaSApple OSS Distributions a -= c; a ^= ROTL32(c, 4); c += b; \
395*aca3beaaSApple OSS Distributions b -= a; b ^= ROTL32(a, 6); a += c; \
396*aca3beaaSApple OSS Distributions c -= b; c ^= ROTL32(b, 8); b += a; \
397*aca3beaaSApple OSS Distributions a -= c; a ^= ROTL32(c, 16); c += b; \
398*aca3beaaSApple OSS Distributions b -= a; b ^= ROTL32(a, 19); a += c; \
399*aca3beaaSApple OSS Distributions c -= b; c ^= ROTL32(b, 4); b += a; \
400*aca3beaaSApple OSS Distributions }
401*aca3beaaSApple OSS Distributions
402*aca3beaaSApple OSS Distributions #define JHASH_FINAL(a, b, c) { \
403*aca3beaaSApple OSS Distributions c ^= b; c -= ROTL32(b, 14); \
404*aca3beaaSApple OSS Distributions a ^= c; a -= ROTL32(c, 11); \
405*aca3beaaSApple OSS Distributions b ^= a; b -= ROTL32(a, 25); \
406*aca3beaaSApple OSS Distributions c ^= b; c -= ROTL32(b, 16); \
407*aca3beaaSApple OSS Distributions a ^= c; a -= ROTL32(c, 4); \
408*aca3beaaSApple OSS Distributions b ^= a; b -= ROTL32(a, 14); \
409*aca3beaaSApple OSS Distributions c ^= b; c -= ROTL32(b, 24); \
410*aca3beaaSApple OSS Distributions }
411*aca3beaaSApple OSS Distributions
412*aca3beaaSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
413*aca3beaaSApple OSS Distributions /*
414*aca3beaaSApple OSS Distributions * hashbig()
415*aca3beaaSApple OSS Distributions */
416*aca3beaaSApple OSS Distributions u_int32_t
net_flowhash_jhash(const void * key,u_int32_t len,const u_int32_t seed)417*aca3beaaSApple OSS Distributions net_flowhash_jhash(const void *key, u_int32_t len, const u_int32_t seed)
418*aca3beaaSApple OSS Distributions {
419*aca3beaaSApple OSS Distributions u_int32_t a, b, c;
420*aca3beaaSApple OSS Distributions
421*aca3beaaSApple OSS Distributions /* Set up the internal state */
422*aca3beaaSApple OSS Distributions a = b = c = JHASH_INIT + len + seed;
423*aca3beaaSApple OSS Distributions
424*aca3beaaSApple OSS Distributions if (ALIGNED32(key)) {
425*aca3beaaSApple OSS Distributions /* read 32-bit chunks */
426*aca3beaaSApple OSS Distributions const u_int32_t *k = (const u_int32_t *)key;
427*aca3beaaSApple OSS Distributions
428*aca3beaaSApple OSS Distributions /*
429*aca3beaaSApple OSS Distributions * all but last block:
430*aca3beaaSApple OSS Distributions * aligned reads and affect 32 bits of (a,b,c)
431*aca3beaaSApple OSS Distributions */
432*aca3beaaSApple OSS Distributions while (len > 12) {
433*aca3beaaSApple OSS Distributions a += k[0];
434*aca3beaaSApple OSS Distributions b += k[1];
435*aca3beaaSApple OSS Distributions c += k[2];
436*aca3beaaSApple OSS Distributions JHASH_MIX(a, b, c);
437*aca3beaaSApple OSS Distributions len -= 12;
438*aca3beaaSApple OSS Distributions k += 3;
439*aca3beaaSApple OSS Distributions }
440*aca3beaaSApple OSS Distributions
441*aca3beaaSApple OSS Distributions /*
442*aca3beaaSApple OSS Distributions * handle the last (probably partial) block
443*aca3beaaSApple OSS Distributions *
444*aca3beaaSApple OSS Distributions * "k[2] << 8" actually reads beyond the end of the string,
445*aca3beaaSApple OSS Distributions * but then shifts out the part it's not allowed to read.
446*aca3beaaSApple OSS Distributions * Because the string is aligned, the illegal read is in
447*aca3beaaSApple OSS Distributions * the same word as the rest of the string. The masking
448*aca3beaaSApple OSS Distributions * trick does make the hash noticably faster for short
449*aca3beaaSApple OSS Distributions * strings (like English words).
450*aca3beaaSApple OSS Distributions */
451*aca3beaaSApple OSS Distributions switch (len) {
452*aca3beaaSApple OSS Distributions case 12:
453*aca3beaaSApple OSS Distributions c += k[2];
454*aca3beaaSApple OSS Distributions b += k[1];
455*aca3beaaSApple OSS Distributions a += k[0];
456*aca3beaaSApple OSS Distributions break;
457*aca3beaaSApple OSS Distributions
458*aca3beaaSApple OSS Distributions case 11:
459*aca3beaaSApple OSS Distributions c += k[2] & 0xffffff00;
460*aca3beaaSApple OSS Distributions b += k[1];
461*aca3beaaSApple OSS Distributions a += k[0];
462*aca3beaaSApple OSS Distributions break;
463*aca3beaaSApple OSS Distributions
464*aca3beaaSApple OSS Distributions case 10:
465*aca3beaaSApple OSS Distributions c += k[2] & 0xffff0000;
466*aca3beaaSApple OSS Distributions b += k[1];
467*aca3beaaSApple OSS Distributions a += k[0];
468*aca3beaaSApple OSS Distributions break;
469*aca3beaaSApple OSS Distributions
470*aca3beaaSApple OSS Distributions case 9:
471*aca3beaaSApple OSS Distributions c += k[2] & 0xff000000;
472*aca3beaaSApple OSS Distributions b += k[1];
473*aca3beaaSApple OSS Distributions a += k[0];
474*aca3beaaSApple OSS Distributions break;
475*aca3beaaSApple OSS Distributions
476*aca3beaaSApple OSS Distributions case 8:
477*aca3beaaSApple OSS Distributions b += k[1];
478*aca3beaaSApple OSS Distributions a += k[0];
479*aca3beaaSApple OSS Distributions break;
480*aca3beaaSApple OSS Distributions
481*aca3beaaSApple OSS Distributions case 7:
482*aca3beaaSApple OSS Distributions b += k[1] & 0xffffff00;
483*aca3beaaSApple OSS Distributions a += k[0];
484*aca3beaaSApple OSS Distributions break;
485*aca3beaaSApple OSS Distributions
486*aca3beaaSApple OSS Distributions case 6:
487*aca3beaaSApple OSS Distributions b += k[1] & 0xffff0000;
488*aca3beaaSApple OSS Distributions a += k[0];
489*aca3beaaSApple OSS Distributions break;
490*aca3beaaSApple OSS Distributions
491*aca3beaaSApple OSS Distributions case 5:
492*aca3beaaSApple OSS Distributions b += k[1] & 0xff000000;
493*aca3beaaSApple OSS Distributions a += k[0];
494*aca3beaaSApple OSS Distributions break;
495*aca3beaaSApple OSS Distributions
496*aca3beaaSApple OSS Distributions case 4:
497*aca3beaaSApple OSS Distributions a += k[0];
498*aca3beaaSApple OSS Distributions break;
499*aca3beaaSApple OSS Distributions
500*aca3beaaSApple OSS Distributions case 3:
501*aca3beaaSApple OSS Distributions a += k[0] & 0xffffff00;
502*aca3beaaSApple OSS Distributions break;
503*aca3beaaSApple OSS Distributions
504*aca3beaaSApple OSS Distributions case 2:
505*aca3beaaSApple OSS Distributions a += k[0] & 0xffff0000;
506*aca3beaaSApple OSS Distributions break;
507*aca3beaaSApple OSS Distributions
508*aca3beaaSApple OSS Distributions case 1:
509*aca3beaaSApple OSS Distributions a += k[0] & 0xff000000;
510*aca3beaaSApple OSS Distributions break;
511*aca3beaaSApple OSS Distributions
512*aca3beaaSApple OSS Distributions case 0:
513*aca3beaaSApple OSS Distributions /* zero length requires no mixing */
514*aca3beaaSApple OSS Distributions return c;
515*aca3beaaSApple OSS Distributions }
516*aca3beaaSApple OSS Distributions
517*aca3beaaSApple OSS Distributions JHASH_FINAL(a, b, c);
518*aca3beaaSApple OSS Distributions
519*aca3beaaSApple OSS Distributions return c;
520*aca3beaaSApple OSS Distributions }
521*aca3beaaSApple OSS Distributions
522*aca3beaaSApple OSS Distributions /* need to read the key one byte at a time */
523*aca3beaaSApple OSS Distributions const u_int8_t *k = (const u_int8_t *)key;
524*aca3beaaSApple OSS Distributions
525*aca3beaaSApple OSS Distributions /* all but the last block: affect some 32 bits of (a,b,c) */
526*aca3beaaSApple OSS Distributions while (len > 12) {
527*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[0]) << 24;
528*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[1]) << 16;
529*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[2]) << 8;
530*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[3]);
531*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[4]) << 24;
532*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[5]) << 16;
533*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[6]) << 8;
534*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[7]);
535*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[8]) << 24;
536*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[9]) << 16;
537*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[10]) << 8;
538*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[11]);
539*aca3beaaSApple OSS Distributions JHASH_MIX(a, b, c);
540*aca3beaaSApple OSS Distributions len -= 12;
541*aca3beaaSApple OSS Distributions k += 12;
542*aca3beaaSApple OSS Distributions }
543*aca3beaaSApple OSS Distributions
544*aca3beaaSApple OSS Distributions /* last block: affect all 32 bits of (c) */
545*aca3beaaSApple OSS Distributions switch (len) {
546*aca3beaaSApple OSS Distributions case 12:
547*aca3beaaSApple OSS Distributions c += k[11];
548*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
549*aca3beaaSApple OSS Distributions case 11:
550*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[10]) << 8;
551*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
552*aca3beaaSApple OSS Distributions case 10:
553*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[9]) << 16;
554*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
555*aca3beaaSApple OSS Distributions case 9:
556*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[8]) << 24;
557*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
558*aca3beaaSApple OSS Distributions case 8:
559*aca3beaaSApple OSS Distributions b += k[7];
560*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
561*aca3beaaSApple OSS Distributions case 7:
562*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[6]) << 8;
563*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
564*aca3beaaSApple OSS Distributions case 6:
565*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[5]) << 16;
566*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
567*aca3beaaSApple OSS Distributions case 5:
568*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[4]) << 24;
569*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
570*aca3beaaSApple OSS Distributions case 4:
571*aca3beaaSApple OSS Distributions a += k[3];
572*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
573*aca3beaaSApple OSS Distributions case 3:
574*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[2]) << 8;
575*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
576*aca3beaaSApple OSS Distributions case 2:
577*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[1]) << 16;
578*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
579*aca3beaaSApple OSS Distributions case 1:
580*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[0]) << 24;
581*aca3beaaSApple OSS Distributions break;
582*aca3beaaSApple OSS Distributions
583*aca3beaaSApple OSS Distributions case 0:
584*aca3beaaSApple OSS Distributions /* zero length requires no mixing */
585*aca3beaaSApple OSS Distributions return c;
586*aca3beaaSApple OSS Distributions }
587*aca3beaaSApple OSS Distributions
588*aca3beaaSApple OSS Distributions JHASH_FINAL(a, b, c);
589*aca3beaaSApple OSS Distributions
590*aca3beaaSApple OSS Distributions return c;
591*aca3beaaSApple OSS Distributions }
592*aca3beaaSApple OSS Distributions #else /* LITTLE_ENDIAN */
593*aca3beaaSApple OSS Distributions /*
594*aca3beaaSApple OSS Distributions * hashlittle()
595*aca3beaaSApple OSS Distributions */
596*aca3beaaSApple OSS Distributions u_int32_t
net_flowhash_jhash(const void * key,u_int32_t len,const u_int32_t seed)597*aca3beaaSApple OSS Distributions net_flowhash_jhash(const void *key, u_int32_t len, const u_int32_t seed)
598*aca3beaaSApple OSS Distributions {
599*aca3beaaSApple OSS Distributions u_int32_t a, b, c;
600*aca3beaaSApple OSS Distributions
601*aca3beaaSApple OSS Distributions /* Set up the internal state */
602*aca3beaaSApple OSS Distributions a = b = c = JHASH_INIT + len + seed;
603*aca3beaaSApple OSS Distributions
604*aca3beaaSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
605*aca3beaaSApple OSS Distributions /*
606*aca3beaaSApple OSS Distributions * On i386/x86_64, it is faster to read 32-bit chunks if the key
607*aca3beaaSApple OSS Distributions * is aligned 32-bit OR not 16-bit, and perform 16-bit reads if it
608*aca3beaaSApple OSS Distributions * is aligned 16-bit.
609*aca3beaaSApple OSS Distributions */
610*aca3beaaSApple OSS Distributions if (ALIGNED32(key) || !ALIGNED16(key)) {
611*aca3beaaSApple OSS Distributions #else /* !defined(__i386__) && !defined(__x86_64__) */
612*aca3beaaSApple OSS Distributions if (ALIGNED32(key)) {
613*aca3beaaSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
614*aca3beaaSApple OSS Distributions /* read 32-bit chunks */
615*aca3beaaSApple OSS Distributions const u_int32_t *k = (const u_int32_t *)key;
616*aca3beaaSApple OSS Distributions const u_int16_t *k16 = (const u_int16_t *)key;
617*aca3beaaSApple OSS Distributions const u_int8_t *k8 = (const u_int8_t *)key;
618*aca3beaaSApple OSS Distributions
619*aca3beaaSApple OSS Distributions /*
620*aca3beaaSApple OSS Distributions * all but last block:
621*aca3beaaSApple OSS Distributions * aligned reads and affect 32 bits of (a,b,c)
622*aca3beaaSApple OSS Distributions */
623*aca3beaaSApple OSS Distributions while (len > 12) {
624*aca3beaaSApple OSS Distributions a += k[0];
625*aca3beaaSApple OSS Distributions b += k[1];
626*aca3beaaSApple OSS Distributions c += k[2];
627*aca3beaaSApple OSS Distributions JHASH_MIX(a, b, c);
628*aca3beaaSApple OSS Distributions len -= 12;
629*aca3beaaSApple OSS Distributions k += 3;
630*aca3beaaSApple OSS Distributions }
631*aca3beaaSApple OSS Distributions
632*aca3beaaSApple OSS Distributions /* handle the last (probably partial) block */
633*aca3beaaSApple OSS Distributions switch (len) {
634*aca3beaaSApple OSS Distributions case 12:
635*aca3beaaSApple OSS Distributions c += k[2];
636*aca3beaaSApple OSS Distributions b += k[1];
637*aca3beaaSApple OSS Distributions a += k[0];
638*aca3beaaSApple OSS Distributions break;
639*aca3beaaSApple OSS Distributions
640*aca3beaaSApple OSS Distributions case 11:
641*aca3beaaSApple OSS Distributions c += ((u_int32_t)k8[10]) << 16;
642*aca3beaaSApple OSS Distributions c += k16[4];
643*aca3beaaSApple OSS Distributions b += k[1];
644*aca3beaaSApple OSS Distributions a += k[0];
645*aca3beaaSApple OSS Distributions break;
646*aca3beaaSApple OSS Distributions
647*aca3beaaSApple OSS Distributions case 10:
648*aca3beaaSApple OSS Distributions c += k16[4];
649*aca3beaaSApple OSS Distributions b += k[1];
650*aca3beaaSApple OSS Distributions a += k[0];
651*aca3beaaSApple OSS Distributions break;
652*aca3beaaSApple OSS Distributions
653*aca3beaaSApple OSS Distributions case 9:
654*aca3beaaSApple OSS Distributions c += k8[8];
655*aca3beaaSApple OSS Distributions b += k[1];
656*aca3beaaSApple OSS Distributions a += k[0];
657*aca3beaaSApple OSS Distributions break;
658*aca3beaaSApple OSS Distributions
659*aca3beaaSApple OSS Distributions case 8:
660*aca3beaaSApple OSS Distributions b += k[1];
661*aca3beaaSApple OSS Distributions a += k[0];
662*aca3beaaSApple OSS Distributions break;
663*aca3beaaSApple OSS Distributions
664*aca3beaaSApple OSS Distributions case 7:
665*aca3beaaSApple OSS Distributions b += ((u_int32_t)k8[6]) << 16;
666*aca3beaaSApple OSS Distributions b += k16[2];
667*aca3beaaSApple OSS Distributions a += k[0];
668*aca3beaaSApple OSS Distributions break;
669*aca3beaaSApple OSS Distributions
670*aca3beaaSApple OSS Distributions case 6:
671*aca3beaaSApple OSS Distributions b += k16[2];
672*aca3beaaSApple OSS Distributions a += k[0];
673*aca3beaaSApple OSS Distributions break;
674*aca3beaaSApple OSS Distributions
675*aca3beaaSApple OSS Distributions case 5:
676*aca3beaaSApple OSS Distributions b += k8[4];
677*aca3beaaSApple OSS Distributions a += k[0];
678*aca3beaaSApple OSS Distributions break;
679*aca3beaaSApple OSS Distributions
680*aca3beaaSApple OSS Distributions case 4:
681*aca3beaaSApple OSS Distributions a += k[0];
682*aca3beaaSApple OSS Distributions break;
683*aca3beaaSApple OSS Distributions
684*aca3beaaSApple OSS Distributions case 3:
685*aca3beaaSApple OSS Distributions a += ((u_int32_t)k8[2]) << 16;
686*aca3beaaSApple OSS Distributions a += k16[0];
687*aca3beaaSApple OSS Distributions break;
688*aca3beaaSApple OSS Distributions
689*aca3beaaSApple OSS Distributions case 2:
690*aca3beaaSApple OSS Distributions a += k16[0];
691*aca3beaaSApple OSS Distributions break;
692*aca3beaaSApple OSS Distributions
693*aca3beaaSApple OSS Distributions case 1:
694*aca3beaaSApple OSS Distributions a += k8[0];
695*aca3beaaSApple OSS Distributions break;
696*aca3beaaSApple OSS Distributions
697*aca3beaaSApple OSS Distributions case 0:
698*aca3beaaSApple OSS Distributions /* zero length requires no mixing */
699*aca3beaaSApple OSS Distributions return c;
700*aca3beaaSApple OSS Distributions }
701*aca3beaaSApple OSS Distributions
702*aca3beaaSApple OSS Distributions JHASH_FINAL(a, b, c);
703*aca3beaaSApple OSS Distributions
704*aca3beaaSApple OSS Distributions return c;
705*aca3beaaSApple OSS Distributions }
706*aca3beaaSApple OSS Distributions #if !defined(__i386__) && !defined(__x86_64__)
707*aca3beaaSApple OSS Distributions else if (ALIGNED16(key)) {
708*aca3beaaSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
709*aca3beaaSApple OSS Distributions /* read 16-bit chunks */
710*aca3beaaSApple OSS Distributions const u_int16_t *k = (const u_int16_t *)key;
711*aca3beaaSApple OSS Distributions const u_int8_t *k8;
712*aca3beaaSApple OSS Distributions
713*aca3beaaSApple OSS Distributions /* all but last block: aligned reads and different mixing */
714*aca3beaaSApple OSS Distributions while (len > 12) {
715*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
716*aca3beaaSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
717*aca3beaaSApple OSS Distributions c += k[4] + (((u_int32_t)k[5]) << 16);
718*aca3beaaSApple OSS Distributions JHASH_MIX(a, b, c);
719*aca3beaaSApple OSS Distributions len -= 12;
720*aca3beaaSApple OSS Distributions k += 6;
721*aca3beaaSApple OSS Distributions }
722*aca3beaaSApple OSS Distributions
723*aca3beaaSApple OSS Distributions /* handle the last (probably partial) block */
724*aca3beaaSApple OSS Distributions k8 = (const u_int8_t *)k;
725*aca3beaaSApple OSS Distributions switch (len) {
726*aca3beaaSApple OSS Distributions case 12:
727*aca3beaaSApple OSS Distributions c += k[4] + (((u_int32_t)k[5]) << 16);
728*aca3beaaSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
729*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
730*aca3beaaSApple OSS Distributions break;
731*aca3beaaSApple OSS Distributions
732*aca3beaaSApple OSS Distributions case 11:
733*aca3beaaSApple OSS Distributions c += ((u_int32_t)k8[10]) << 16;
734*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
735*aca3beaaSApple OSS Distributions case 10:
736*aca3beaaSApple OSS Distributions c += k[4];
737*aca3beaaSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
738*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
739*aca3beaaSApple OSS Distributions break;
740*aca3beaaSApple OSS Distributions
741*aca3beaaSApple OSS Distributions case 9:
742*aca3beaaSApple OSS Distributions c += k8[8];
743*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
744*aca3beaaSApple OSS Distributions case 8:
745*aca3beaaSApple OSS Distributions b += k[2] + (((u_int32_t)k[3]) << 16);
746*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
747*aca3beaaSApple OSS Distributions break;
748*aca3beaaSApple OSS Distributions
749*aca3beaaSApple OSS Distributions case 7:
750*aca3beaaSApple OSS Distributions b += ((u_int32_t)k8[6]) << 16;
751*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
752*aca3beaaSApple OSS Distributions case 6:
753*aca3beaaSApple OSS Distributions b += k[2];
754*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
755*aca3beaaSApple OSS Distributions break;
756*aca3beaaSApple OSS Distributions
757*aca3beaaSApple OSS Distributions case 5:
758*aca3beaaSApple OSS Distributions b += k8[4];
759*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
760*aca3beaaSApple OSS Distributions case 4:
761*aca3beaaSApple OSS Distributions a += k[0] + (((u_int32_t)k[1]) << 16);
762*aca3beaaSApple OSS Distributions break;
763*aca3beaaSApple OSS Distributions
764*aca3beaaSApple OSS Distributions case 3:
765*aca3beaaSApple OSS Distributions a += ((u_int32_t)k8[2]) << 16;
766*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
767*aca3beaaSApple OSS Distributions case 2:
768*aca3beaaSApple OSS Distributions a += k[0];
769*aca3beaaSApple OSS Distributions break;
770*aca3beaaSApple OSS Distributions
771*aca3beaaSApple OSS Distributions case 1:
772*aca3beaaSApple OSS Distributions a += k8[0];
773*aca3beaaSApple OSS Distributions break;
774*aca3beaaSApple OSS Distributions
775*aca3beaaSApple OSS Distributions case 0:
776*aca3beaaSApple OSS Distributions /* zero length requires no mixing */
777*aca3beaaSApple OSS Distributions return c;
778*aca3beaaSApple OSS Distributions }
779*aca3beaaSApple OSS Distributions
780*aca3beaaSApple OSS Distributions JHASH_FINAL(a, b, c);
781*aca3beaaSApple OSS Distributions
782*aca3beaaSApple OSS Distributions return c;
783*aca3beaaSApple OSS Distributions #if !defined(__i386__) && !defined(__x86_64__)
784*aca3beaaSApple OSS Distributions }
785*aca3beaaSApple OSS Distributions
786*aca3beaaSApple OSS Distributions /* need to read the key one byte at a time */
787*aca3beaaSApple OSS Distributions const u_int8_t *k = (const u_int8_t *)key;
788*aca3beaaSApple OSS Distributions
789*aca3beaaSApple OSS Distributions /* all but the last block: affect some 32 bits of (a,b,c) */
790*aca3beaaSApple OSS Distributions while (len > 12) {
791*aca3beaaSApple OSS Distributions a += k[0];
792*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[1]) << 8;
793*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[2]) << 16;
794*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[3]) << 24;
795*aca3beaaSApple OSS Distributions b += k[4];
796*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[5]) << 8;
797*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[6]) << 16;
798*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[7]) << 24;
799*aca3beaaSApple OSS Distributions c += k[8];
800*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[9]) << 8;
801*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[10]) << 16;
802*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[11]) << 24;
803*aca3beaaSApple OSS Distributions JHASH_MIX(a, b, c);
804*aca3beaaSApple OSS Distributions len -= 12;
805*aca3beaaSApple OSS Distributions k += 12;
806*aca3beaaSApple OSS Distributions }
807*aca3beaaSApple OSS Distributions
808*aca3beaaSApple OSS Distributions /* last block: affect all 32 bits of (c) */
809*aca3beaaSApple OSS Distributions switch (len) {
810*aca3beaaSApple OSS Distributions case 12:
811*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[11]) << 24;
812*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
813*aca3beaaSApple OSS Distributions case 11:
814*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[10]) << 16;
815*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
816*aca3beaaSApple OSS Distributions case 10:
817*aca3beaaSApple OSS Distributions c += ((u_int32_t)k[9]) << 8;
818*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
819*aca3beaaSApple OSS Distributions case 9:
820*aca3beaaSApple OSS Distributions c += k[8];
821*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
822*aca3beaaSApple OSS Distributions case 8:
823*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[7]) << 24;
824*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
825*aca3beaaSApple OSS Distributions case 7:
826*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[6]) << 16;
827*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
828*aca3beaaSApple OSS Distributions case 6:
829*aca3beaaSApple OSS Distributions b += ((u_int32_t)k[5]) << 8;
830*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
831*aca3beaaSApple OSS Distributions case 5:
832*aca3beaaSApple OSS Distributions b += k[4];
833*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
834*aca3beaaSApple OSS Distributions case 4:
835*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[3]) << 24;
836*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
837*aca3beaaSApple OSS Distributions case 3:
838*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[2]) << 16;
839*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
840*aca3beaaSApple OSS Distributions case 2:
841*aca3beaaSApple OSS Distributions a += ((u_int32_t)k[1]) << 8;
842*aca3beaaSApple OSS Distributions OS_FALLTHROUGH;
843*aca3beaaSApple OSS Distributions case 1:
844*aca3beaaSApple OSS Distributions a += k[0];
845*aca3beaaSApple OSS Distributions break;
846*aca3beaaSApple OSS Distributions
847*aca3beaaSApple OSS Distributions case 0:
848*aca3beaaSApple OSS Distributions /* zero length requires no mixing */
849*aca3beaaSApple OSS Distributions return c;
850*aca3beaaSApple OSS Distributions }
851*aca3beaaSApple OSS Distributions
852*aca3beaaSApple OSS Distributions JHASH_FINAL(a, b, c);
853*aca3beaaSApple OSS Distributions
854*aca3beaaSApple OSS Distributions return c;
855*aca3beaaSApple OSS Distributions #endif /* !defined(__i386__) && !defined(__x86_64__) */
856*aca3beaaSApple OSS Distributions }
857*aca3beaaSApple OSS Distributions #endif /* LITTLE_ENDIAN */
858