42#include "nl-default.h"
44#include <netlink/hash.h>
47#define HASH_LITTLE_ENDIAN 1
48#define HASH_BIG_ENDIAN 0
50#define HASH_LITTLE_ENDIAN 0
51#define HASH_BIG_ENDIAN 1
56#define hashsize(n) ((uint32_t)1<<(n))
57#define hashmask(n) (hashsize(n)-1)
58#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
106 a -= c; a ^= rot(c, 4); c += b; \
107 b -= a; b ^= rot(a, 6); a += c; \
108 c -= b; c ^= rot(b, 8); b += a; \
109 a -= c; a ^= rot(c,16); c += b; \
110 b -= a; b ^= rot(a,19); a += c; \
111 c -= b; c ^= rot(b, 4); b += a; \
139#define final(a,b,c) \
141 c ^= b; c -= rot(b,14); \
142 a ^= c; a -= rot(c,11); \
143 b ^= a; b -= rot(a,25); \
144 c ^= b; c -= rot(b,16); \
145 a ^= c; a -= rot(c,4); \
146 b ^= a; b -= rot(a,14); \
147 c ^= b; c -= rot(b,24); \
178static uint32_t hashlittle(
const void *key,
size_t length, uint32_t *val2 )
181 union {
const void *ptr;
size_t i; } u;
184 a = b = c = 0xdeadbeef + ((uint32_t)length) + *val2;
187 if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
188 const uint32_t *k = (
const uint32_t *)key;
217 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
218 case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0];
break;
219 case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0];
break;
220 case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0];
break;
221 case 8 : b+=k[1]; a+=k[0];
break;
222 case 7 : b+=k[1]&0xffffff; a+=k[0];
break;
223 case 6 : b+=k[1]&0xffff; a+=k[0];
break;
224 case 5 : b+=k[1]&0xff; a+=k[0];
break;
225 case 4 : a+=k[0];
break;
226 case 3 : a+=k[0]&0xffffff;
break;
227 case 2 : a+=k[0]&0xffff;
break;
228 case 1 : a+=k[0]&0xff;
break;
234 k8 = (
const uint8_t *)k;
237 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
238 case 11: c+=((uint32_t)k8[10])<<16;
239 case 10: c+=((uint32_t)k8[9])<<8;
241 case 8 : b+=k[1]; a+=k[0];
break;
242 case 7 : b+=((uint32_t)k8[6])<<16;
243 case 6 : b+=((uint32_t)k8[5])<<8;
245 case 4 : a+=k[0];
break;
246 case 3 : a+=((uint32_t)k8[2])<<16;
247 case 2 : a+=((uint32_t)k8[1])<<8;
248 case 1 : a+=k8[0];
break;
254 }
else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
255 const uint16_t *k = (
const uint16_t *)key;
261 a += k[0] + (((uint32_t)k[1])<<16);
262 b += k[2] + (((uint32_t)k[3])<<16);
263 c += k[4] + (((uint32_t)k[5])<<16);
270 k8 = (
const uint8_t *)k;
273 case 12: c+=k[4]+(((uint32_t)k[5])<<16);
274 b+=k[2]+(((uint32_t)k[3])<<16);
275 a+=k[0]+(((uint32_t)k[1])<<16);
277 case 11: c+=((uint32_t)k8[10])<<16;
279 b+=k[2]+(((uint32_t)k[3])<<16);
280 a+=k[0]+(((uint32_t)k[1])<<16);
283 case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
284 a+=k[0]+(((uint32_t)k[1])<<16);
286 case 7 : b+=((uint32_t)k8[6])<<16;
288 a+=k[0]+(((uint32_t)k[1])<<16);
291 case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
293 case 3 : a+=((uint32_t)k8[2])<<16;
302 const uint8_t *k = (
const uint8_t *)key;
308 a += ((uint32_t)k[1])<<8;
309 a += ((uint32_t)k[2])<<16;
310 a += ((uint32_t)k[3])<<24;
312 b += ((uint32_t)k[5])<<8;
313 b += ((uint32_t)k[6])<<16;
314 b += ((uint32_t)k[7])<<24;
316 c += ((uint32_t)k[9])<<8;
317 c += ((uint32_t)k[10])<<16;
318 c += ((uint32_t)k[11])<<24;
327 case 12: c+=((uint32_t)k[11])<<24;
328 case 11: c+=((uint32_t)k[10])<<16;
329 case 10: c+=((uint32_t)k[9])<<8;
331 case 8 : b+=((uint32_t)k[7])<<24;
332 case 7 : b+=((uint32_t)k[6])<<16;
333 case 6 : b+=((uint32_t)k[5])<<8;
335 case 4 : a+=((uint32_t)k[3])<<24;
336 case 3 : a+=((uint32_t)k[2])<<16;
337 case 2 : a+=((uint32_t)k[1])<<8;
355static uint32_t hashbig(
const void *key,
size_t length, uint32_t *val2)
358 union {
const void *ptr;
size_t i; } u;
361 a = b = c = 0xdeadbeef + ((uint32_t)length) + *val2;
364 if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
365 const uint32_t *k = (
const uint32_t *)key;
394 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
395 case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0];
break;
396 case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0];
break;
397 case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0];
break;
398 case 8 : b+=k[1]; a+=k[0];
break;
399 case 7 : b+=k[1]&0xffffff00; a+=k[0];
break;
400 case 6 : b+=k[1]&0xffff0000; a+=k[0];
break;
401 case 5 : b+=k[1]&0xff000000; a+=k[0];
break;
402 case 4 : a+=k[0];
break;
403 case 3 : a+=k[0]&0xffffff00;
break;
404 case 2 : a+=k[0]&0xffff0000;
break;
405 case 1 : a+=k[0]&0xff000000;
break;
411 k8 = (
const uint8_t *)k;
414 case 12: c+=k[2]; b+=k[1]; a+=k[0];
break;
415 case 11: c+=((uint32_t)k8[10])<<8;
416 case 10: c+=((uint32_t)k8[9])<<16;
417 case 9 : c+=((uint32_t)k8[8])<<24;
418 case 8 : b+=k[1]; a+=k[0];
break;
419 case 7 : b+=((uint32_t)k8[6])<<8;
420 case 6 : b+=((uint32_t)k8[5])<<16;
421 case 5 : b+=((uint32_t)k8[4])<<24;
422 case 4 : a+=k[0];
break;
423 case 3 : a+=((uint32_t)k8[2])<<8;
424 case 2 : a+=((uint32_t)k8[1])<<16;
425 case 1 : a+=((uint32_t)k8[0])<<24;
break;
432 const uint8_t *k = (
const uint8_t *)key;
437 a += ((uint32_t)k[0])<<24;
438 a += ((uint32_t)k[1])<<16;
439 a += ((uint32_t)k[2])<<8;
440 a += ((uint32_t)k[3]);
441 b += ((uint32_t)k[4])<<24;
442 b += ((uint32_t)k[5])<<16;
443 b += ((uint32_t)k[6])<<8;
444 b += ((uint32_t)k[7]);
445 c += ((uint32_t)k[8])<<24;
446 c += ((uint32_t)k[9])<<16;
447 c += ((uint32_t)k[10])<<8;
448 c += ((uint32_t)k[11]);
458 case 11: c+=((uint32_t)k[10])<<8;
459 case 10: c+=((uint32_t)k[9])<<16;
460 case 9 : c+=((uint32_t)k[8])<<24;
462 case 7 : b+=((uint32_t)k[6])<<8;
463 case 6 : b+=((uint32_t)k[5])<<16;
464 case 5 : b+=((uint32_t)k[4])<<24;
466 case 3 : a+=((uint32_t)k[2])<<8;
467 case 2 : a+=((uint32_t)k[1])<<16;
468 case 1 : a+=((uint32_t)k[0])<<24;
479uint32_t nl_hash_any(
const void *key,
size_t length, uint32_t base)
482 return hashbig(key, length, &base);
484 return hashlittle(key, length, &base);