mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-17 08:38:42 +00:00
Hash: Fix of previous commit
This commit is contained in:
parent
54ac0becee
commit
d39d41fbda
17
lib/hash.h
17
lib/hash.h
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user