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 {
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::<u32>() 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);
}
}