#bloom-filter #iron #found #side #invertable #rose #strata

iron_rose

Rust 对可逆布隆过滤器与分层估计器的实现,如 https://www.ics.uci.edu/~eppstein/pubs/EppGooUye-SIGCOMM-11.pdf 中所述

2 个版本

0.1.1 2021年8月25日
0.1.0 2021年8月25日

#1675 in 数据结构

MIT 许可证

21KB
465

铁玫瑰:(Rust 的可逆布隆过滤器)

是什么?

铁玫瑰是对可逆布隆过滤器的一种 Rust 实现,如 What's the Difference? Efficient Set Reconciliation without Prior Context 中所述

预期用途

use iron_rose::{Side, StrataEstimator, IBF};
use uuid::Uuid;

let mut estimator = StrataEstimator::default();
let mut remote_estimator = StrataEstimator::default();
let core = (0..1000)
    .map(|_| Uuid::new_v4().to_u128_le())
    .collect::<Vec<_>>();
let local_ids = (0..50)
    .map(|_| Uuid::new_v4().to_u128_le())
    .collect::<Vec<_>>();
let remote_ids = (0..50)
    .map(|_| Uuid::new_v4().to_u128_le())
    .collect::<Vec<_>>();
let ids_from_database = core.iter().chain(local_ids.iter()).collect::<Vec<_>>();
for x in ids_from_database.iter() {
    estimator.encode(**x);
}
for x in core.iter().chain(remote_ids.iter()) {
   remote_estimator.encode(*x);
}
// Retreive Remote Estimator in some way
let ibf_size = estimator
    .estimate_differences(&remote_estimator)
    .expect("estimators should be same shape");
let mut local = IBF::new(ibf_size);
let mut remote = IBF::new(ibf_size);
for x in ids_from_database.iter() {
    local.encode(**x);
}
for x in core.iter().chain(remote_ids.iter()) {
    remote.encode(*x);
}
// Retreive remote IBF
let diff = (local - remote).expect("Local and remote should be the same shape");
let differences = diff
    .decode()
    .expect("Successfully decoded because IBFs were large enough");

值得注意的要点

使用 Rust 的 trait 系统,我们实际上可以说任何实现了 BitXOR 和 Serializable/Deserializable 的东西都可以通过 IBF 发送,这意味着我们得到了 IBF 基本思想的益处,但可以编码比 ID 更大、更复杂的东西。

未来增强功能 "我计划添加"™ 是围绕各种基本类型的包装器,使我们能够相对容易地发送和接收切片。

依赖关系

~2–3MB
~63K SLoC