#bloom #bitmap #xor-filter

xorfilter-rs

异或过滤器:比布隆过滤器和小鸟过滤器更快、更小

6 个版本 (重大变更)

0.5.1 2021年9月8日
0.5.0 2021年8月29日
0.4.0 2021年3月13日
0.3.0 2021年3月10日
0.1.0 2020年3月18日

#688算法 类别中

Download history 1143/week @ 2024-04-23 1424/week @ 2024-04-30 1589/week @ 2024-05-07 1534/week @ 2024-05-14 1377/week @ 2024-05-21 1122/week @ 2024-05-28 1399/week @ 2024-06-04 1088/week @ 2024-06-11 1000/week @ 2024-06-18 1013/week @ 2024-06-25 924/week @ 2024-07-02 828/week @ 2024-07-09 708/week @ 2024-07-16 661/week @ 2024-07-23 626/week @ 2024-07-30 647/week @ 2024-08-06

每月下载量 2,790 次
8 个crate中 使用(直接使用3个)

Apache-2.0

83KB
2K SLoC

Rustdoc simple-build-test

Rust 实现的异或过滤器库

rust-lang 中实现了 Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters,发表于《实验算法杂志》(待发表)。

此包是从其 golang 实现版本 转换而来。

如何在 Rust 项目中使用 xorfilter

在项目的 Cargo.toml 中添加以下内容

[dependencies]
xorfilter-rs = "0.2.0"

[dependencies]
xorfilter-rs = { git = "https://github.com/bnclabs/xorfilter" }
use xorfilter::Xor8;

let mut keys: Vec<u64> = vec![];
for _ in 0..num_keys {
    keys.push(rng.gen());
}

let mut filter = Xor8::new(); // new filter.
filter.populate_keys(&keys); // populate keys.
filter.build(); // build bitmap.

for key in 0..lookup {
    // there can be false positives, but no false negatives.
    filter.contains_key(key);
}

打开问题

  • 序列化/反序列化 Xor8 类型。
  • 向预先构建的 Xor8 实例逐步添加密钥。
  • 收集其他实现(Go、C、C++、Erlang、Java、Python)的基准测试结果。

基准测试

以下是针对 1000 万个 u64 密钥的测试结果

构建 10M 密钥 成员资格 假阳性率 每条记录的位数
Xor8-C 1.206 秒 NA 0.389 % 9.84 位
Xor8-rust 1.809 秒 61.716 纳秒 0.392 % 9.84 位
Fuse8-C 0.508 秒 NA 0.390 % 9.02 位
Fuse8-rust 0.577 秒 42.657 纳秒 0.392 % 9.02 位
Fuse16-C 0.515 秒 NA 0.001 % 18.04 位
Fuse16-rust 0.621 秒 54.657 纳秒 0.001 % 18.03 位
  • 构建时间 以秒为单位,针对 1000 万条记录。
  • 成员资格 以纳秒为单位,针对 1000 万条记录中的一个查找。
  • 假阳性率 以百分比表示

贡献

  • 简单的工作流程。Fork - 修改 - 提交请求。
  • 在创建 PR 之前,
    • 运行 make build 以确认所有构建版本均通过,无警告和无错误。
    • 使用 0 警告、0 错误和所有测试用例通过运行 check.sh
    • 使用 0 警告、0 错误和所有测试用例通过运行 perf.sh
    • 安装 并运行 cargo spellcheck 以移除常见的拼写错误。
  • 推荐使用开发者原产地证书

无运行时依赖