Hash: fixed rta hashing wrt. structure padding
This commit is contained in:
parent
286e2011d2
commit
54ac0becee
2 changed files with 46 additions and 11 deletions
38
lib/hash.h
38
lib/hash.h
|
@ -178,16 +178,36 @@
|
|||
|
||||
#define HASH_WALK_FILTER_END } while (0)
|
||||
|
||||
static inline uint
|
||||
mem_hash(void *p, int s)
|
||||
{
|
||||
const char *pp = p;
|
||||
const u64 multiplier = 0xb38bc09a61202731ULL;
|
||||
u64 value = 0x001047d54778bcafULL;
|
||||
int i;
|
||||
for (i=0;i<s;i++)
|
||||
value = value*multiplier + pp[i];
|
||||
typedef mem_hash_t u64;
|
||||
|
||||
static inline void
|
||||
mem_hash_init(mem_hash_t *h)
|
||||
{
|
||||
*h = 0x001047d54778bcafULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
mem_hash_mix(mem_hash_t *h, void *p, int s)
|
||||
{
|
||||
const u64 multiplier = 0xb38bc09a61202731ULL;
|
||||
const char *pp = p;
|
||||
uint i;
|
||||
for (i=0; i<s; i++)
|
||||
*h = *h * multiplier + pp[i];
|
||||
}
|
||||
|
||||
static inline uint
|
||||
mem_hash_value(mem_hash_t *h)
|
||||
{
|
||||
return ((value >> 32) ^ (value & 0xffffffff));
|
||||
}
|
||||
|
||||
static inline uint
|
||||
mem_hash(void *p, int s)
|
||||
{
|
||||
static mem_hash_t h;
|
||||
mem_hash_init(&h);
|
||||
mem_hash_mix(&h, p, s);
|
||||
return mem_hash_value(&h);
|
||||
}
|
||||
|
||||
|
|
|
@ -946,8 +946,23 @@ rta_alloc_hash(void)
|
|||
static inline uint
|
||||
rta_hash(rta *a)
|
||||
{
|
||||
return mem_hash(((void *)a) + offsetof(rta, src), sizeof(rta) - offsetof(rta, src)) ^
|
||||
mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs);
|
||||
mem_hash_t h;
|
||||
mem_hash_init(&h);
|
||||
#define MIX(f) mem_hash_mix(&h, &(rta->f), sizeof(rta->f));
|
||||
MIX(src);
|
||||
MIX(hostentry);
|
||||
MIX(iface);
|
||||
MIX(gw);
|
||||
MIX(from);
|
||||
MIX(igp_metric);
|
||||
MIX(source);
|
||||
MIX(scope);
|
||||
MIX(cast);
|
||||
MIX(dest);
|
||||
MIX(flags);
|
||||
MIX(aflags);
|
||||
|
||||
return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
Loading…
Reference in a new issue