mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-23 01:16:30 +00:00
fix some bugs in sharding - still doesnt work
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user