Hash: Fix of previous commit

This commit is contained in:
Jan Moskyto Matejka 2016-05-13 13:46:46 +02:00
parent 54ac0becee
commit d39d41fbda
2 changed files with 12 additions and 10 deletions

View file

@ -178,34 +178,35 @@
#define HASH_WALK_FILTER_END } while (0) #define HASH_WALK_FILTER_END } while (0)
typedef mem_hash_t u64;
static inline void static inline void
mem_hash_init(mem_hash_t *h) mem_hash_init(u64 *h)
{ {
*h = 0x001047d54778bcafULL; *h = 0x001047d54778bcafULL;
} }
static inline void 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 u64 multiplier = 0xb38bc09a61202731ULL;
const char *pp = p; const char *pp = p;
uint i; 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]; *h = *h * multiplier + pp[i];
} }
static inline uint static inline uint
mem_hash_value(mem_hash_t *h) mem_hash_value(u64 *h)
{ {
return ((value >> 32) ^ (value & 0xffffffff)); return ((*h >> 32) ^ (*h & 0xffffffff));
} }
static inline uint static inline uint
mem_hash(void *p, int s) mem_hash(void *p, int s)
{ {
static mem_hash_t h; static u64 h;
mem_hash_init(&h); mem_hash_init(&h);
mem_hash_mix(&h, p, s); mem_hash_mix(&h, p, s);
return mem_hash_value(&h); return mem_hash_value(&h);

View file

@ -946,9 +946,9 @@ rta_alloc_hash(void)
static inline uint static inline uint
rta_hash(rta *a) rta_hash(rta *a)
{ {
mem_hash_t h; u64 h;
mem_hash_init(&h); mem_hash_init(&h);
#define MIX(f) mem_hash_mix(&h, &(rta->f), sizeof(rta->f)); #define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f));
MIX(src); MIX(src);
MIX(hostentry); MIX(hostentry);
MIX(iface); MIX(iface);
@ -961,6 +961,7 @@ rta_hash(rta *a)
MIX(dest); MIX(dest);
MIX(flags); MIX(flags);
MIX(aflags); MIX(aflags);
#undef MIX
return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs); return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs);
} }