#[cfg(feature = "binary-fuse")]
pub mod bfuse;
pub mod fuse;
pub mod xor;
use crate::murmur3;
pub struct HashSet {
pub hash: u64,
pub hset: [usize; 3],
}
#[derive(Default, Copy, Clone)]
pub struct KeyIndex {
pub hash: u64,
pub index: usize,
}
#[derive(Default, Clone)]
pub struct HSet {
pub count: u32,
pub mask: u64,
}
#[inline]
pub const fn mix(key: u64, seed: u64) -> u64 {
murmur3::mix64(key.overflowing_add(seed).0)
}
#[doc(hidden)]
#[macro_export]
macro_rules! fingerprint(
($hash:expr) => {
$hash ^ ($hash >> 32)
};
);
#[doc(hidden)]
#[macro_export]
macro_rules! rotl64(
($n:expr, by $c:expr) => {
($n << ($c & 63)) | ($n >> ((-$c) & 63))
};
);
#[doc(hidden)]
#[macro_export]
macro_rules! reduce(
($hash:ident on interval $n:expr) => {
(($hash as u64 * $n as u64) >> 32) as usize
};
);
#[doc(hidden)]
#[macro_export]
macro_rules! make_block(
(with $size:ident sets) => {
{
let sets_block = vec![Default::default(); $size];
sets_block.into_boxed_slice()
}
};
);
#[doc(hidden)]
#[macro_export]
macro_rules! make_fp_block(
($size:ident) => {
{
#[cfg(feature = "uniform-random")] {
use rand::Rng;
let mut rng = rand::thread_rng();
let mut block = Vec::with_capacity($size);
for _ in 0..$size {
block.push(rng.gen());
}
block.into_boxed_slice()
}
#[cfg(not(feature = "uniform-random"))] {
make_block!(with $size sets)
}
}
}
);
#[doc(hidden)]
#[macro_export]
macro_rules! try_enqueue(
(block $H_block:expr, set $idx:ident; queue block $Q_block:expr, with size $qblock_size:expr) => {
if $H_block[$idx].count == 1 {
$Q_block[$qblock_size].index = $idx;
$Q_block[$qblock_size].hash = $H_block[$idx].mask;
$qblock_size += 1;
}
};
);
#[cfg(debug_assertions)]
pub fn all_distinct(keys: impl IntoIterator<Item = u64>) -> bool {
let mut s = alloc::collections::BTreeSet::new();
keys.into_iter().all(move |x| s.insert(x))
}