罂粟 一种新的布隆过滤器格式和开源项目

主要观点

  • 在 CIRCL 常将 bloom 过滤器用于某些用例,如为 Hashlookup 数据库提供缓存机制,最初使用 DCSO 的 bloom 项目,后重新用 Rust 实现为 Poppy。
  • 回顾原代码时发现位索引生成算法类似 Lehmer 随机数生成器且 m 值特殊,进一步优化时发现按特定方式将 bit 集大小设为 2 的幂会使过滤器的实际假阳性概率大幅增加,还面临指数增长问题,因此决定转向新实现。
  • 新实现为类似哈希表包含 Bloom 过滤器的结构,选择 0x8000 位(4096 字节)大小,利用 2 的幂优化和内存页大小优势,采用双哈希和 wyhash 哈希函数,还探索了其他优化,如调整表大小和预过滤位集。
  • 经过基准测试,新实现在速度上约快 2 倍,对数据集增长更平稳,且有整合的 bench 命令方便用户选择最佳设置,还有其他改进如多线程创建过滤器等。
  • 总结了关于 bloom 过滤器的经验教训,包括注意位索引生成算法和哈希函数,要进行充分测试,未来将扩展 Poppy 库并邀请外部贡献。

关键信息

  • CIRCL 常使用 bloom 过滤器,原用 DCSO 的 bloom 项目后改为 Poppy。
  • 原代码位索引生成算法及 m 值特殊,优化时出现假阳性概率问题和指数增长问题。
  • 新实现结构及相关参数选择,如 4096 字节大小、双哈希和 wyhash 等。
  • 基准测试结果显示新实现速度快、对数据集增长平稳,还有其他改进。
  • 总结经验教训,提及未来工作和相关项目。

重要细节

  • 原代码位索引生成算法中 m 理论上与被除数大小不同,值为 18446744073709551557,g 为 18446744073709550147,通过计算得出位索引。
  • 优化时发现按 2 的幂设置 bit 集大小会使假阳性概率大幅增加,在原项目中已开 issue 跟踪。
  • 新实现结构为哈希表包含 Bloom 过滤器,利用 2 的幂优化和内存页大小优势,位索引采用双哈希和 wyhash 哈希函数。
  • 基准测试数据集大小在 10MB 到 7GB 之间,数据类型为 sha1 字符串,假阳性概率为 0.001,测试结果显示新实现速度快、对数据集增长更平稳,还有空间影响等方面的测试。
  • 总结中提到要注意 bit 索引生成算法和哈希函数,未来将扩展 Poppy 库并邀请外部贡献,Poppy 项目由 NGSOTI 项目开发,该项目致力于培训 SOC 操作员等。
阅读 9
0 条评论