From 36985f8da0cea59cb1912f62ae4e700983159b6a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 5 Nov 2021 18:04:18 +0000 Subject: [PATCH] Simplification to `ptr_map_hash_key` --- src/ptr_map.cpp | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/ptr_map.cpp b/src/ptr_map.cpp index 66a6f0fc5..3d6be1d44 100644 --- a/src/ptr_map.cpp +++ b/src/ptr_map.cpp @@ -28,21 +28,11 @@ struct PtrMap { u32 ptr_map_hash_key(uintptr key) { #if defined(GB_ARCH_64_BIT) - // TODO(bill): Improve ptr_map_hash_key - u32 key0 = (u32)(key & 0xffffffff); - u32 key1 = (u32)(key >> 32); - - u32 word; - u32 state = 0; - - state += key0 * 747796405u + 2891336453u; - word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; - state = (word >> 22u) ^ word; - state += key1 * 747796405u + 2891336453u; - word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; - state = (word >> 22u) ^ word; - return state; - + u64 x = (u64)key; + u8 count = (u8)(x >> 59); + x ^= x >> (5 + count); + x *= 12605985483714917081ull; + return (u32)(x ^ (x >> 43)); #elif defined(GB_ARCH_32_BIT) u32 state = ((u32)key) * 747796405u + 2891336453u; u32 word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;