From 27c05cfd533381aeb435d2c14eac94515ce4f82e Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 8 Feb 2022 10:05:10 -0800 Subject: [PATCH] fix some bugs in sharding - still doesnt work --- src/sharding.rs | 52 ++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/sharding.rs b/src/sharding.rs index 39c955f..e9cd365 100644 --- a/src/sharding.rs +++ b/src/sharding.rs @@ -29,9 +29,7 @@ impl Sharder { pub fn pg_bigint_hash(&self, key: i64) -> usize { let mut lohalf = key as u32; let hihalf = (key >> 32) as u32; - println!("{}, {}", lohalf, hihalf); lohalf ^= if key >= 0 { hihalf } else { !hihalf }; - println!("Low half: {}", lohalf); Self::pg_u32_hash(lohalf) as usize % self.shards } @@ -44,45 +42,51 @@ impl Sharder { a = a.wrapping_sub(c); a ^= Self::rot(c, 4); c = c.wrapping_add(b); - b = b.wrapping_add(a); + + b = b.wrapping_sub(a); b ^= Self::rot(a, 6); a = a.wrapping_add(c); - c = c.wrapping_add(b); + + c = c.wrapping_sub(b); c ^= Self::rot(b, 8); b = b.wrapping_add(a); - a = a.wrapping_add(c); + + a = a.wrapping_sub(c); a ^= Self::rot(c, 16); c = c.wrapping_add(b); - b = b.wrapping_add(a); + + b = b.wrapping_sub(a); b ^= Self::rot(a, 19); a = a.wrapping_add(c); - c = c.wrapping_add(b); + + c = c.wrapping_sub(b); c ^= Self::rot(b, 4); b = b.wrapping_add(a); + (a, b, c) } #[inline] fn _final(mut a: u32, mut b: u32, mut c: u32) -> (u32, u32, u32) { c ^= b; - c = c.wrapping_add(Self::rot(b, 14)); + c = c.wrapping_sub(Self::rot(b, 14)); a ^= c; - a = a.wrapping_add(Self::rot(c, 11)); + a = a.wrapping_sub(Self::rot(c, 11)); b ^= a; - b = b.wrapping_add(Self::rot(a, 25)); + b = b.wrapping_sub(Self::rot(a, 25)); c ^= b; - c = c.wrapping_add(Self::rot(b, 16)); + c = c.wrapping_sub(Self::rot(b, 16)); a ^= c; - a = a.wrapping_add(Self::rot(c, 4)); + a = a.wrapping_sub(Self::rot(c, 4)); b ^= a; - b = b.wrapping_add(Self::rot(a, 14)); + b = b.wrapping_sub(Self::rot(a, 14)); c ^= b; - c = c.wrapping_add(Self::rot(b, 24)); + c = c.wrapping_sub(Self::rot(b, 24)); (a, b, c) } - fn pg_u32_hash(val: u32) -> u64 { - let mut a: u32 = 0x9e3779b9 + 4 + 3923095; + fn pg_u32_hash(k: u32) -> u64 { + let mut a: u32 = 0x9e3779b9 as u32 + std::mem::size_of::() as u32 + 3923095 as u32; let mut b = a; let c = a; let seed = PARTITION_HASH_SEED; @@ -91,11 +95,11 @@ impl Sharder { b = b.wrapping_add(seed as u32); let (mut a, b, c) = Self::mix(a, b, c); - a = a.wrapping_add(val); + a = a.wrapping_add(k); let (a, b, c) = Self::_final(a, b, c); - (b as u64) << 32 | c as u64 + ((b as u64) << 32) | (c as u64) } } @@ -113,9 +117,17 @@ mod test { #[test] fn test_pg_bigint_hash() { - let sharder = Sharder::new(4); - let key = 23423423 as i64; + let sharder = Sharder::new(2); + let key = 1 as i64; let shard = sharder.pg_bigint_hash(key); assert_eq!(shard, 0); + + let key = 2 as i64; + let shard = sharder.pg_bigint_hash(key); + assert_eq!(shard, 0); + + let key = 3 as i64; + let shard = sharder.pg_bigint_hash(key); + assert_eq!(shard, 1); } }