ブルームフィルタを更新していくロジックがいまいちわからんが、なんとなく
use std::hash::{DefaultHasher, Hash, Hasher};
#[derive(Debug, PartialEq, Clone)]
struct BloomFilter {
filter: [i32; 10],
}
impl BloomFilter {
fn set_v(&mut self, val: String) {
let list: Vec<u8> = self.n_hash(val);
for l in list {
let i = usize::from(l);
if self.filter[i] == 0 {
self.filter[i] = 1
} else {
self.filter[i] = 2 }
}
}
fn n_hash(&self, val: String) -> Vec<u8>{
let hashed = siphash(val);
let list: Vec<u8> = s_digit(hashed);
return list
}
fn check_v(self, val: String) -> bool {
let list: Vec<u8> = self.n_hash(val);
let mut c_bf = BloomFilter { filter: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]};
for l in list {
let i = usize::from(l);
if c_bf.filter[i] == 0 {
c_bf.filter[i] = 1
} else {
c_bf.filter[i] = 2 }
}
return self == c_bf
}
}
fn siphash(s: String) -> u64 {
let mut siphash = DefaultHasher::new();
s.hash(&mut siphash);
return siphash.finish()
}
fn s_digit(n: u64) -> Vec<u8> {
n.to_string()
.chars()
.into_iter()
.map(|char| char.to_digit(10).unwrap() as u8)
.collect()
}
fn main(){
let mut bf = BloomFilter { filter: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]};
bf.set_v("hello world".to_string());
println!("{:?}", bf);
println!("{}", bf.clone().check_v("hello world!".to_string()));
println!("{}", bf.clone().check_v("hello world".to_string()));
}
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.33s
Running `target/debug/wallet`
BloomFilter { filter: [2, 2, 0, 1, 2, 1, 1, 2, 2, 2] }
false
true