summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2016-05-12 18:11:12 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2016-05-12 18:11:12 +0200
commit776d6b2c05fe8b14e5ec357eca24fe59c549bfa4 (patch)
treee51624fc0984bf98d6c23b46e9c15e2dccf410ce /lib
parentaf678af0d5c9ef3d8afdc0789b33dd0c40b6d6e5 (diff)
parent54ac0beceedb9b36eb58dd8599ba903c668382f6 (diff)
Merge remote-tracking branch 'origin/int-new' into int-new
Diffstat (limited to 'lib')
-rw-r--r--lib/hash.h34
1 files changed, 27 insertions, 7 deletions
diff --git a/lib/hash.h b/lib/hash.h
index b0641466..b86a2eb1 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -178,16 +178,36 @@
#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);
+}
+