ブルームフィルタを更新していくロジックがいまいちわからんが、なんとなく
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