@@ -1,6 +1,7 @@
|
||||
// Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0.
|
||||
|
||||
use bytes::{BufMut, Bytes, BytesMut};
|
||||
use anyhow::{bail, Result};
|
||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||
|
||||
/// Implements a bloom filter
|
||||
pub struct Bloom {
|
||||
@@ -45,19 +46,26 @@ impl<T: AsMut<[u8]>> BitSliceMut for T {
|
||||
|
||||
impl Bloom {
|
||||
/// Decode a bloom filter
|
||||
pub fn decode(buf: &[u8]) -> Self {
|
||||
let filter = &buf[..buf.len() - 1];
|
||||
let k = buf[buf.len() - 1];
|
||||
Self {
|
||||
pub fn decode(buf: &[u8]) -> Result<Self> {
|
||||
let checksum = (&buf[buf.len() - 4..buf.len()]).get_u32();
|
||||
if checksum != crc32fast::hash(&buf[..buf.len() - 4]) {
|
||||
bail!("checksum mismatched for bloom filters");
|
||||
}
|
||||
let filter = &buf[..buf.len() - 5];
|
||||
let k = buf[buf.len() - 5];
|
||||
Ok(Self {
|
||||
filter: filter.to_vec().into(),
|
||||
k,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Encode a bloom filter
|
||||
pub fn encode(&self, buf: &mut Vec<u8>) {
|
||||
let offset = buf.len();
|
||||
buf.extend(&self.filter);
|
||||
buf.put_u8(self.k);
|
||||
let checksum = crc32fast::hash(&buf[offset..]);
|
||||
buf.put_u32(checksum);
|
||||
}
|
||||
|
||||
/// Get bloom filter bits per key from entries count and FPR
|
||||
|
||||
Reference in New Issue
Block a user