2 个版本
0.1.1 | 2021年8月25日 |
---|---|
0.1.0 | 2021年8月25日 |
#1675 in 数据结构
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