#[derive(Debug, Clone)]
pub struct BloomConfig {
pub expected_items: usize,
pub false_positive_rate: f64,
}
impl BloomConfig {
pub fn new(expected_items: usize, false_positive_rate: f64) -> Self {
assert!(expected_items > 0, "expected_items must be > 0");
assert!(
0.0 < false_positive_rate && false_positive_rate < 1.0,
"false_positive_rate must be between 0 and 1"
);
Self {
expected_items,
false_positive_rate,
}
}
pub fn optimal_size(&self) -> usize {
let n = self.expected_items as f64;
let p = self.false_positive_rate;
let m = -(n * p.ln()) / (2f64.ln().powi(2));
m.ceil() as usize
}
pub fn optimal_hashes(&self) -> usize {
let m = self.optimal_size() as f64;
let n = self.expected_items as f64;
let k = (m / n) * 2f64.ln();
k.ceil().max(1.0) as usize
}
pub fn parameters(&self) -> (usize, usize) {
(self.optimal_size(), self.optimal_hashes())
}
}