in common/rusty_leveldb_sgx/src/filter.rs [155:178]
fn key_may_match(&self, key: &[u8], filter: &[u8]) -> bool {
if filter.len() == 0 {
return true;
}
let bits = (filter.len() - 1) as u32 * 8;
let k = filter[filter.len() - 1];
let filter_adj = &filter[0..filter.len() - 1];
if k > 30 {
return true;
}
let mut h = self.bloom_hash(key);
let delta = (h >> 17) | (h << 15);
for _ in 0..k {
let bitpos = (h % bits) as usize;
if (filter_adj[bitpos / 8] & (1 << (bitpos % 8))) == 0 {
return false;
}
h = (h as u64 + delta as u64) as u32;
}
true
}