Line | Count | Source |
1 | | /* jhash.h: Jenkins hash support. |
2 | | * |
3 | | * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net) |
4 | | * |
5 | | * http://burtleburtle.net/bob/hash/ |
6 | | * |
7 | | * These are the credits from Bob's sources: |
8 | | * |
9 | | * lookup2.c, by Bob Jenkins, December 1996, Public Domain. |
10 | | * hash(), hash2(), hash3, and mix() are externally useful functions. |
11 | | * Routines to test the hash are included if SELF_TEST is defined. |
12 | | * You can use this free for any purpose. It has no warranty. |
13 | | * |
14 | | * Copyright (C) 2003 David S. Miller (davem@redhat.com) |
15 | | * |
16 | | * I've modified Bob's hash to be useful in the Linux kernel, and |
17 | | * any bugs present are surely my fault. -DaveM |
18 | | */ |
19 | | |
20 | | #include "zebra.h" |
21 | | #include "jhash.h" |
22 | | |
23 | | /* The golden ration: an arbitrary value */ |
24 | 1.28M | #define JHASH_GOLDEN_RATIO 0x9e3779b9 |
25 | | |
26 | | /* NOTE: Arguments are modified. */ |
27 | | #define __jhash_mix(a, b, c) \ |
28 | 1.05M | { \ |
29 | 1.05M | a -= b; \ |
30 | 1.05M | a -= c; \ |
31 | 1.05M | a ^= (c >> 13); \ |
32 | 1.05M | b -= c; \ |
33 | 1.05M | b -= a; \ |
34 | 1.05M | b ^= (a << 8); \ |
35 | 1.05M | c -= a; \ |
36 | 1.05M | c -= b; \ |
37 | 1.05M | c ^= (b >> 13); \ |
38 | 1.05M | a -= b; \ |
39 | 1.05M | a -= c; \ |
40 | 1.05M | a ^= (c >> 12); \ |
41 | 1.05M | b -= c; \ |
42 | 1.05M | b -= a; \ |
43 | 1.05M | b ^= (a << 16); \ |
44 | 1.05M | c -= a; \ |
45 | 1.05M | c -= b; \ |
46 | 1.05M | c ^= (b >> 5); \ |
47 | 1.05M | a -= b; \ |
48 | 1.05M | a -= c; \ |
49 | 1.05M | a ^= (c >> 3); \ |
50 | 1.05M | b -= c; \ |
51 | 1.05M | b -= a; \ |
52 | 1.05M | b ^= (a << 10); \ |
53 | 1.05M | c -= a; \ |
54 | 1.05M | c -= b; \ |
55 | 1.05M | c ^= (b >> 15); \ |
56 | 1.05M | } |
57 | | |
58 | | /* The most generic version, hashes an arbitrary sequence |
59 | | * of bytes. No alignment or length assumptions are made about |
60 | | * the input key. |
61 | | */ |
62 | | uint32_t jhash(const void *key, uint32_t length, uint32_t initval) |
63 | | __attribute__((no_sanitize("unsigned-integer-overflow"))) |
64 | 420k | { |
65 | 420k | uint32_t a, b, c, len; |
66 | 420k | const uint8_t *k = key; |
67 | | |
68 | 420k | len = length; |
69 | 420k | a = b = JHASH_GOLDEN_RATIO; |
70 | 420k | c = initval; |
71 | | |
72 | 525k | while (len >= 12) { |
73 | 105k | a += (k[0] + ((uint32_t)k[1] << 8) + ((uint32_t)k[2] << 16) |
74 | 105k | + ((uint32_t)k[3] << 24)); |
75 | 105k | b += (k[4] + ((uint32_t)k[5] << 8) + ((uint32_t)k[6] << 16) |
76 | 105k | + ((uint32_t)k[7] << 24)); |
77 | 105k | c += (k[8] + ((uint32_t)k[9] << 8) + ((uint32_t)k[10] << 16) |
78 | 105k | + ((uint32_t)k[11] << 24)); |
79 | | |
80 | 105k | __jhash_mix(a, b, c); |
81 | | |
82 | 105k | k += 12; |
83 | 105k | len -= 12; |
84 | 105k | } |
85 | | |
86 | 420k | c += length; |
87 | 420k | switch (len) { |
88 | 43.2k | case 11: |
89 | 43.2k | c += ((uint32_t)k[10] << 24); |
90 | | /* fallthru */ |
91 | 50.6k | case 10: |
92 | 50.6k | c += ((uint32_t)k[9] << 16); |
93 | | /* fallthru */ |
94 | 308k | case 9: |
95 | 308k | c += ((uint32_t)k[8] << 8); |
96 | | /* fallthru */ |
97 | 337k | case 8: |
98 | 337k | b += ((uint32_t)k[7] << 24); |
99 | | /* fallthru */ |
100 | 337k | case 7: |
101 | 337k | b += ((uint32_t)k[6] << 16); |
102 | | /* fallthru */ |
103 | 338k | case 6: |
104 | 338k | b += ((uint32_t)k[5] << 8); |
105 | | /* fallthru */ |
106 | 338k | case 5: |
107 | 338k | b += k[4]; |
108 | | /* fallthru */ |
109 | 386k | case 4: |
110 | 386k | a += ((uint32_t)k[3] << 24); |
111 | | /* fallthru */ |
112 | 388k | case 3: |
113 | 388k | a += ((uint32_t)k[2] << 16); |
114 | | /* fallthru */ |
115 | 389k | case 2: |
116 | 389k | a += ((uint32_t)k[1] << 8); |
117 | | /* fallthru */ |
118 | 390k | case 1: |
119 | 390k | a += k[0]; |
120 | 420k | } |
121 | | |
122 | 420k | __jhash_mix(a, b, c); |
123 | | |
124 | 420k | return c; |
125 | 420k | } |
126 | | |
127 | | /* A special optimized version that handles 1 or more of uint32_ts. |
128 | | * The length parameter here is the number of uint32_ts in the key. |
129 | | */ |
130 | | uint32_t jhash2(const uint32_t *k, uint32_t length, uint32_t initval) |
131 | | __attribute__((no_sanitize("unsigned-integer-overflow"))) |
132 | 183k | { |
133 | 183k | uint32_t a, b, c, len; |
134 | | |
135 | 183k | a = b = JHASH_GOLDEN_RATIO; |
136 | 183k | c = initval; |
137 | 183k | len = length; |
138 | | |
139 | 193k | while (len >= 3) { |
140 | 9.79k | a += k[0]; |
141 | 9.79k | b += k[1]; |
142 | 9.79k | c += k[2]; |
143 | 9.79k | __jhash_mix(a, b, c); |
144 | 9.79k | k += 3; |
145 | 9.79k | len -= 3; |
146 | 9.79k | } |
147 | | |
148 | 183k | c += length * 4; |
149 | | |
150 | 183k | switch (len) { |
151 | 183k | case 2: |
152 | 183k | b += k[1]; |
153 | | /* fallthru */ |
154 | 183k | case 1: |
155 | 183k | a += k[0]; |
156 | 183k | } |
157 | | |
158 | 183k | __jhash_mix(a, b, c); |
159 | | |
160 | 183k | return c; |
161 | 183k | } |
162 | | |
163 | | |
164 | | /* A special ultra-optimized versions that knows they are hashing exactly |
165 | | * 3, 2 or 1 word(s). |
166 | | * |
167 | | * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally |
168 | | * done at the end is not done here. |
169 | | */ |
170 | | uint32_t jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval) |
171 | | __attribute__((no_sanitize("unsigned-integer-overflow"))) |
172 | 339k | { |
173 | 339k | a += JHASH_GOLDEN_RATIO; |
174 | 339k | b += JHASH_GOLDEN_RATIO; |
175 | 339k | c += initval; |
176 | | |
177 | 339k | __jhash_mix(a, b, c); |
178 | | |
179 | 339k | return c; |
180 | 339k | } |
181 | | |
182 | | uint32_t jhash_2words(uint32_t a, uint32_t b, uint32_t initval) |
183 | 15.5k | { |
184 | 15.5k | return jhash_3words(a, b, 0, initval); |
185 | 15.5k | } |
186 | | |
187 | | uint32_t jhash_1word(uint32_t a, uint32_t initval) |
188 | 312k | { |
189 | 312k | return jhash_3words(a, 0, 0, initval); |
190 | 312k | } |