fix some bugs in sharding - still doesnt work

This commit is contained in:
Lev Kokotov
2022-02-08 10:05:10 -08:00
parent 2557c4408e
commit 27c05cfd53

View File

@@ -29,9 +29,7 @@ impl Sharder {
pub fn pg_bigint_hash(&self, key: i64) -> usize { pub fn pg_bigint_hash(&self, key: i64) -> usize {
let mut lohalf = key as u32; let mut lohalf = key as u32;
let hihalf = (key >> 32) as u32; let hihalf = (key >> 32) as u32;
println!("{}, {}", lohalf, hihalf);
lohalf ^= if key >= 0 { hihalf } else { !hihalf }; lohalf ^= if key >= 0 { hihalf } else { !hihalf };
println!("Low half: {}", lohalf);
Self::pg_u32_hash(lohalf) as usize % self.shards Self::pg_u32_hash(lohalf) as usize % self.shards
} }
@@ -44,45 +42,51 @@ impl Sharder {
a = a.wrapping_sub(c); a = a.wrapping_sub(c);
a ^= Self::rot(c, 4); a ^= Self::rot(c, 4);
c = c.wrapping_add(b); c = c.wrapping_add(b);
b = b.wrapping_add(a);
b = b.wrapping_sub(a);
b ^= Self::rot(a, 6); b ^= Self::rot(a, 6);
a = a.wrapping_add(c); a = a.wrapping_add(c);
c = c.wrapping_add(b);
c = c.wrapping_sub(b);
c ^= Self::rot(b, 8); c ^= Self::rot(b, 8);
b = b.wrapping_add(a); b = b.wrapping_add(a);
a = a.wrapping_add(c);
a = a.wrapping_sub(c);
a ^= Self::rot(c, 16); a ^= Self::rot(c, 16);
c = c.wrapping_add(b); c = c.wrapping_add(b);
b = b.wrapping_add(a);
b = b.wrapping_sub(a);
b ^= Self::rot(a, 19); b ^= Self::rot(a, 19);
a = a.wrapping_add(c); a = a.wrapping_add(c);
c = c.wrapping_add(b);
c = c.wrapping_sub(b);
c ^= Self::rot(b, 4); c ^= Self::rot(b, 4);
b = b.wrapping_add(a); b = b.wrapping_add(a);
(a, b, c) (a, b, c)
} }
#[inline] #[inline]
fn _final(mut a: u32, mut b: u32, mut c: u32) -> (u32, u32, u32) { fn _final(mut a: u32, mut b: u32, mut c: u32) -> (u32, u32, u32) {
c ^= b; c ^= b;
c = c.wrapping_add(Self::rot(b, 14)); c = c.wrapping_sub(Self::rot(b, 14));
a ^= c; a ^= c;
a = a.wrapping_add(Self::rot(c, 11)); a = a.wrapping_sub(Self::rot(c, 11));
b ^= a; b ^= a;
b = b.wrapping_add(Self::rot(a, 25)); b = b.wrapping_sub(Self::rot(a, 25));
c ^= b; c ^= b;
c = c.wrapping_add(Self::rot(b, 16)); c = c.wrapping_sub(Self::rot(b, 16));
a ^= c; a ^= c;
a = a.wrapping_add(Self::rot(c, 4)); a = a.wrapping_sub(Self::rot(c, 4));
b ^= a; b ^= a;
b = b.wrapping_add(Self::rot(a, 14)); b = b.wrapping_sub(Self::rot(a, 14));
c ^= b; c ^= b;
c = c.wrapping_add(Self::rot(b, 24)); c = c.wrapping_sub(Self::rot(b, 24));
(a, b, c) (a, b, c)
} }
fn pg_u32_hash(val: u32) -> u64 { fn pg_u32_hash(k: u32) -> u64 {
let mut a: u32 = 0x9e3779b9 + 4 + 3923095; let mut a: u32 = 0x9e3779b9 as u32 + std::mem::size_of::<u32>() as u32 + 3923095 as u32;
let mut b = a; let mut b = a;
let c = a; let c = a;
let seed = PARTITION_HASH_SEED; let seed = PARTITION_HASH_SEED;
@@ -91,11 +95,11 @@ impl Sharder {
b = b.wrapping_add(seed as u32); b = b.wrapping_add(seed as u32);
let (mut a, b, c) = Self::mix(a, b, c); 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); 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] #[test]
fn test_pg_bigint_hash() { fn test_pg_bigint_hash() {
let sharder = Sharder::new(4); let sharder = Sharder::new(2);
let key = 23423423 as i64; let key = 1 as i64;
let shard = sharder.pg_bigint_hash(key); let shard = sharder.pg_bigint_hash(key);
assert_eq!(shard, 0); 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);
} }
} }