From f5a0210cdfba56fb26bcc1b51bfc5878802bf264 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Thu, 21 Jul 2022 12:15:36 -0700 Subject: [PATCH] More principled seeding approach in the hash functions. --- src/hash.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hash.rs b/src/hash.rs index 49022a9..de535d4 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -1,35 +1,35 @@ /// A fast seedable 32-bit hash function. -/// -/// Based on . pub fn hash_u32(mut n: u32, seed: u32) -> u32 { n ^= 0xe6fe3beb; // So zero doesn't map to zero. n ^= seed; + // From https://github.com/skeeto/hash-prospector n ^= n >> 16; n = n.wrapping_mul(0x21f0aaad); - n ^= seed; n ^= n >> 15; n = n.wrapping_mul(0xd35a2d97); n ^= n >> 15; - n + // We xor by `seed` again in case the first time cancelled out our + // "zero doesn't map to zero" precaution. + n ^ seed } /// A fast seedable 64-bit hash function. -/// -/// Based on . pub fn hash_u64(mut n: u64, seed: u64) -> u64 { n ^= 0x4acc3f27cc712c9d; // So zero doesn't map to zero. n ^= seed; + // From https://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.html n ^= n >> 30; n = n.wrapping_mul(0xbf58476d1ce4e5b9); - n ^= seed; n ^= n >> 27; n = n.wrapping_mul(0x94d049bb133111eb); n ^= n >> 31; - n + // We xor by `seed` again in case the first time cancelled out our + // "zero doesn't map to zero" precaution. + n ^ seed } /// Returns a random float in [0, 1] based on 'n' and a seed.