diff options
-rw-r--r-- | lib/hash.h | 15 | ||||
-rw-r--r-- | nest/rt-attr.c | 3 |
2 files changed, 10 insertions, 8 deletions
@@ -178,26 +178,27 @@ #define HASH_WALK_FILTER_END } while (0) -typedef u64 mem_hash_t; - static inline void -mem_hash_init(mem_hash_t *h) +mem_hash_init(u64 *h) { *h = 0x001047d54778bcafULL; } static inline void -mem_hash_mix(mem_hash_t *h, void *p, int s) +mem_hash_mix(u64 *h, void *p, int s) { const u64 multiplier = 0xb38bc09a61202731ULL; const char *pp = p; uint i; - for (i=0; i<s; i++) + for (i=0; i<s/4; i++) + *h = *h * multiplier + ((const u32 *)pp)[i]; + + for (i=s & ~0x3; i<s; i++) *h = *h * multiplier + pp[i]; } static inline uint -mem_hash_value(mem_hash_t *h) +mem_hash_value(u64 *h) { return ((*h >> 32) ^ (*h & 0xffffffff)); } @@ -205,7 +206,7 @@ mem_hash_value(mem_hash_t *h) static inline uint mem_hash(void *p, int s) { - static mem_hash_t h; + static u64 h; mem_hash_init(&h); mem_hash_mix(&h, p, s); return mem_hash_value(&h); diff --git a/nest/rt-attr.c b/nest/rt-attr.c index 5041ab9f..167bfc44 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -946,7 +946,7 @@ rta_alloc_hash(void) static inline uint rta_hash(rta *a) { - mem_hash_t h; + u64 h; mem_hash_init(&h); #define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f)); MIX(src); @@ -961,6 +961,7 @@ rta_hash(rta *a) MIX(dest); MIX(flags); MIX(aflags); +#undef MIX return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs); } |