8个版本

0.4.3 2024年7月30日
0.4.2 2024年7月24日
0.3.2 2024年7月23日
0.3.1 2023年6月23日
0.1.0 2020年4月1日

#201 in 数据结构

Download history 4044/week @ 2024-04-27 2804/week @ 2024-05-04 2262/week @ 2024-05-11 2291/week @ 2024-05-18 2228/week @ 2024-05-25 1767/week @ 2024-06-01 1546/week @ 2024-06-08 942/week @ 2024-06-15 947/week @ 2024-06-22 689/week @ 2024-06-29 1269/week @ 2024-07-06 993/week @ 2024-07-13 1532/week @ 2024-07-20 1632/week @ 2024-07-27 750/week @ 2024-08-03 683/week @ 2024-08-10

每月下载量4,693次

BSD-3-Clause

59KB
643

bloom2

一个快速的二级布隆过滤器实现,与标准布隆过滤器相比,在空时内存消耗仅为2%。

  • 稀疏分配与过滤器负载成正比增长内存使用量
  • 低开销,快速 O(1) 查找,具有摊销的 O(1) 插入
  • 32位和64位安全
  • 保持与标准布隆过滤器相同的错误接受概率
  • 没有'不安全'代码

CompressedBitmap保持与正常布隆过滤器相同的错误接受属性和类似性能属性,同时根据需要懒加载支持内存,从而使除完全加载的过滤器之外的所有过滤器的内存占用更小。

随着条目数量的增加,布隆过滤器的错误接受概率也会增加,因此它们通常被调整以保持较小的负载因子,从而导致底层位图的使用效率低下。

        ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
        │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │
        └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

这个二级布隆过滤器将位图分成usize位的块,并使用第二个位图来标记已填充的块,根据需要懒加载它们。


	                 ┌───┬───┬───┬───┐
	      Block map: │ 0 │ 1 │ 0 │ 0 │
	                 └───┴─┬─┴───┴───┘
	                       └──────┐
	    ┌ ─ ┬ ─ ┬ ─ ┬ ─ ┐ ┌───┬───▼───┬───┐ ┌ ─ ┬ ─ ┬ ─ ┬ ─ ┐
	      0   0   0   0   │ 1 │ 0 │ 0 │ 1 │   0   0   0   0
	    └ ─ ┴ ─ ┴ ─ ┴ ─ ┘ └───┴───┴───┴───┘ └ ─ ┴ ─ ┴ ─ ┴ ─ ┘

对于落在未填充块中的索引的查找将检查单个块映射位并立即返回。

对于已填充块中的索引的查找,首先检查块映射位,然后通过计算块映射中先于它的1位的数量来确定位图块在位图数组中的偏移量。这非常高效,因为它使用了现代CPU上的POPCNT指令。

用例

非常适合长时间运行、稀疏填充的布隆过滤器,存储在RAM或磁盘上。

如果过滤器比可用的RAM/存储在磁盘上的空间大,可以使用mmap来加载二级布隆过滤器以提高性能。操作系统将根据需要从磁盘懒加载位图块,而频繁访问的块映射将保留在内存中,以提供对未填充块快速负面响应。

序列化

启用可选序列化功能,使用serde功能 - 默认禁用。

请注意,使用默认的 RandomHasher 会导致不同的位图,该位图在不同进程中不可重用;对于序列化过滤器,应使用不同的哈希器。默认情况下,派生的 Hash 实现不被视为可移植的,但可以手动编写实现。

依赖项

~170KB