#define HASH_WALK_FILTER_END } while (0)
-static inline uint
-mem_hash(void *p, int s)
+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 char *pp = p;
const u64 multiplier = 0xb38bc09a61202731ULL;
- u64 value = 0x001047d54778bcafULL;
- int i;
- for (i=0;i<s;i++)
- value = value*multiplier + pp[i];
+ 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);
+}
+
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