#![allow(unused)]
use ethbloom::{Bloom, Input};
#[derive(Default)]
pub struct BloomFilter {
current: Bloom,
previous: Bloom,
}
impl BloomFilter {
pub fn insert(&mut self, bytes: &[u8]) -> bool {
if self.current.contains_input(Input::Raw(bytes))
|| self.previous.contains_input(Input::Raw(bytes))
{
return false;
}
self.current.accrue(Input::Raw(bytes));
true
}
pub fn decay(&mut self) {
self.previous = core::mem::take(&mut self.current);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::runtime::{mock::MockRuntime, Runtime};
use rand::Rng;
#[test]
fn insert_and_decay() {
let messages = (0..5)
.map(|_| {
let mut message = [0u8; 1008];
MockRuntime::rng().fill_bytes(&mut message);
message
})
.collect::<Vec<_>>();
let mut bloom = BloomFilter::default();
assert!(messages.iter().all(|message| bloom.insert(message.as_ref())));
assert!(messages.iter().all(|message| !bloom.insert(message.as_ref())));
bloom.decay();
assert!(messages.iter().all(|message| !bloom.insert(message.as_ref())));
bloom.decay();
assert!(messages.iter().all(|message| bloom.insert(message.as_ref())));
assert!(messages.iter().all(|message| !bloom.insert(message.as_ref())));
}
}