#bloom-filter #cuckoo-filter #hash-values #rsqf #quotient-filter #cqf

qfilter

类似于高效Bloom过滤器的数据结构,基于Rank Select Quotient Filter (RSQF)

9 个版本

0.2.1 2024年7月27日
0.2.0 2024年7月22日
0.1.6 2023年8月2日
0.1.5 2023年7月16日
0.1.1 2022年12月4日

#103数据结构

Download history 16833/week @ 2024-05-03 20130/week @ 2024-05-10 21096/week @ 2024-05-17 21583/week @ 2024-05-24 24627/week @ 2024-05-31 17879/week @ 2024-06-07 18425/week @ 2024-06-14 23232/week @ 2024-06-21 20037/week @ 2024-06-28 9475/week @ 2024-07-05 8463/week @ 2024-07-12 9412/week @ 2024-07-19 8362/week @ 2024-07-26 7718/week @ 2024-08-02 6701/week @ 2024-08-09 7342/week @ 2024-08-16

32,360 每月下载量
qfilter 中使用

MIT 许可证

80KB
1.5K SLoC

Qfilter

类似于高效Bloom过滤器的数据结构,基于Rank Select Quotient Filter (RSQF)

这是一个小型且灵活的通用 AMQ-Filter。它不仅支持类似于Bloom过滤器的近似成员测试,还支持删除、合并、调整大小和 serde 序列化。

  • 高性能
  • 支持删除操作
  • 极为紧凑,比类似的过滤器更加紧凑
  • 可以以初始较小的容量创建,并根据需要增长
  • (De)Serializable with serde
  • 可移植的Rust实现
  • 仅使用可验证的不安全操作

此数据结构类似于一个存储指纹的非常紧凑的哈希表。指纹类似于哈希值,但可能是截断的。假阳性的原因是多个项目可以映射到相同的指纹。更多信息请参阅quotient filter Wikipedia页面,其中描述了类似但不太优化的数据结构版本。实际实现基于Rank Select Quotient Filter (RSQF)

公共API还公开了指纹API,可用于简洁地存储u64哈希值。

示例

let mut f = qfilter::Filter::new(1000000, 0.01);
for i in 0..1000 {
    f.insert(i).unwrap();
}
for i in 0..1000 {
    assert!(f.contains(i));
}

哈希器

使用的哈希算法是xxhash3,它提供高性能和跨平台的稳定性。

过滤器大小

对于给定的容量和错误概率,RSQF可能比等效的Bloom过滤器或其他AMQ-Filters需要的空间要少得多。

每项的位数 满载时的错误概率 每项的位数(继续) 错误(继续)
3.125 0.362 19.125 6.87e-06
4.125 0.201 20.125 3.43e-06
5.125 0.106 21.125 1.72e-06
6.125 0.0547 22.125 8.58e-07
7.125 0.0277 23.125 4.29e-07
8.125 0.014 24.125 2.15e-07
9.125 0.00701 25.125 1.07e-07
10.125 0.00351 26.125 5.36e-08
11.125 0.00176 27.125 2.68e-08
12.125 0.000879 28.125 1.34e-08
13.125 0.000439 29.125 6.71e-09
14.125 0.00022 30.125 3.35e-09
15.125 0.00011 31.125 1.68e-09
16.125 5.49e-05 32.125 8.38e-10
17.125 2.75e-05 .. ..
18.125 1.37e-05 .. ..

版本0.1和0.2之间的兼容性

版本0.2更改了公共API(例如故障构造函数),这需要版本号的重大增加。

序列化在版本0.1和0.2之间双向兼容。

未实现

  • 附加指纹值
  • 使用指纹值进行计数,而不是指纹重复
  • 更高级的增长策略(InfiniFilter)。

旧版 x86_64 CPU 支持

实现假定在为 x86_64 目标编译时,存在 popcnt 指令(等同于 integer.count_ones())。理论上这不能保证,因为该指令仅在 2007/2008 年之后发布的 AMD/Intel CPU 上可用。如果不符合这种情况,Filter 构造函数将引发恐慌。

可以通过启用 legacy_x86_64_support 选项来支持此类旧版 x86_64 CPU,这会带来约 10% 的性能损失。

许可证

本项目采用 MIT 许可证。

依赖项

~100–405KB