mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-27 18:56: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 {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user