finish 2.7

Signed-off-by: Alex Chi <iskyzh@gmail.com>
This commit is contained in:
Alex Chi
2024-01-28 14:08:08 +08:00
parent b96479384c
commit b4485f49c3
15 changed files with 165 additions and 36 deletions

View File

@@ -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