diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2016-05-12 18:11:12 +0200 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2016-05-12 18:11:12 +0200 |
commit | 776d6b2c05fe8b14e5ec357eca24fe59c549bfa4 (patch) | |
tree | e51624fc0984bf98d6c23b46e9c15e2dccf410ce /lib | |
parent | af678af0d5c9ef3d8afdc0789b33dd0c40b6d6e5 (diff) | |
parent | 54ac0beceedb9b36eb58dd8599ba903c668382f6 (diff) |
Merge remote-tracking branch 'origin/int-new' into int-new
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hash.h | 34 |
1 files changed, 27 insertions, 7 deletions
@@ -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); +} + |