mirror of
https://github.com/openvswitch/ovs
synced 2025-10-29 15:28:56 +00:00
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 <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user