From: Ben Pfaff Date: Fri, 14 Dec 2012 21:43:54 +0000 (-0800) Subject: hash: Correct implementation of mhash_finish(). X-Git-Tag: v1.9.0~19 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=5f60b7aabe8449dc08103575b076c8c8168464d3 hash: Correct implementation of mhash_finish(). With rotates instead of shifts, the upper and lower 16 bits of the returned hash are always the same. I noticed this while working on replacing Jenkins hash by murmurhash, because some of the database unit tests started failing, e.g. "row hashing (scalars)". Signed-off-by: Ben Pfaff Acked-by: Ethan Jackson --- diff --git a/lib/hash.h b/lib/hash.h index 701e6866e..96866c42a 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -152,11 +152,11 @@ static inline uint32_t mhash_add(uint32_t hash, uint32_t data) static inline uint32_t mhash_finish(uint32_t hash, size_t n) { hash ^= n * 4; - hash ^= hash_rot(hash, 16); + hash ^= hash >> 16; hash *= 0x85ebca6b; - hash ^= hash_rot(hash, 13); + hash ^= hash >> 13; hash *= 0xc2b2ae35; - hash ^= hash_rot(hash, 16); + hash ^= hash >> 16; return hash; }