diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hash.h | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -178,26 +178,27 @@ #define HASH_WALK_FILTER_END } while (0) -typedef u64 mem_hash_t; - 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 ((*h >> 32) ^ (*h & 0xffffffff)); } @@ -205,7 +206,7 @@ mem_hash_value(mem_hash_t *h) 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); |