diff options
author | Jan Moskyto Matejka <mq@ucw.cz> | 2016-05-13 13:46:46 +0200 |
---|---|---|
committer | Jan Moskyto Matejka <mq@ucw.cz> | 2016-05-13 13:46:46 +0200 |
commit | d39d41fbda2ec86ea2bac27308eb4fb16ecc4702 (patch) | |
tree | 41493bac39010db779499177df82a04c24e3606a /lib/hash.h | |
parent | 54ac0beceedb9b36eb58dd8599ba903c668382f6 (diff) |
Hash: Fix of previous commit
Diffstat (limited to 'lib/hash.h')
-rw-r--r-- | lib/hash.h | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -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); |