summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Moskyto Matejka <mq@ucw.cz>2016-05-13 13:46:46 +0200
committerJan Moskyto Matejka <mq@ucw.cz>2016-05-13 13:46:46 +0200
commitd39d41fbda2ec86ea2bac27308eb4fb16ecc4702 (patch)
tree41493bac39010db779499177df82a04c24e3606a
parent54ac0beceedb9b36eb58dd8599ba903c668382f6 (diff)
Hash: Fix of previous commit
-rw-r--r--lib/hash.h17
-rw-r--r--nest/rt-attr.c5
2 files changed, 12 insertions, 10 deletions
diff --git a/lib/hash.h b/lib/hash.h
index b86a2eb1..c2fd8bca 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -178,34 +178,35 @@
#define HASH_WALK_FILTER_END } while (0)
-typedef mem_hash_t u64;
-
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 ((value >> 32) ^ (value & 0xffffffff));
+ return ((*h >> 32) ^ (*h & 0xffffffff));
}
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 62340530..6ec69a7f 100644
--- a/nest/rt-attr.c
+++ b/nest/rt-attr.c
@@ -946,9 +946,9 @@ 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, &(rta->f), sizeof(rta->f));
+#define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f));
MIX(src);
MIX(hostentry);
MIX(iface);
@@ -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);
}