【问题标题】:Alternatives to Bloom Filter布隆过滤器的替代品
【发布时间】:2017-05-07 21:59:52
【问题描述】:

我曾尝试使用布隆过滤器来执行成员资格测试。我希望对 800 亿个条目执行成员资格测试,只允许发生大约 100 次冲突,即,只有 100 个条目可以给出误报结果。

我知道这可以通过布隆过滤器来实现,但使用公式来确定每个条目所需的位数和给定允许的误报率的哈希函数数。我想我最终会使用 270 GB 的内存和 19 个哈希函数。

我还查看了 Cuckoo 过滤器,但它的内存要求不符合我的要求。我的要求如下:

  1. 每个元素最多使用 6 位
  2. 使用不超过 7-8 个哈希函数。

有人可以向我推荐一种概率数据结构,而不是上面提到的,这可以帮助实现我的要求吗?

【问题讨论】:

  • 您似乎不太可能找到任何数据结构,可以让您区分 800 亿个项目,误报率为 0.00000000125,仅使用 60 GB,即使您没有对哈希函数数量的限制。我没有数学来证明这一点,但在我看来,你正在突破理论上可能的界限。
  • 好的,如果我增加内存或者我的误报率上升到项目的 1%,那么布隆过滤器对于我的用例来说是一个不错的选择,或者是否有任何其他概率数据结构可以作为更好的选择?

标签: data-structures bloom-filter


【解决方案1】:

散列函数的数量问题并不是真正的问题 - 只需选择一个具有许多输出位的单个散列函数并将这些位分开,就好像它们来自单独的散列函数一样。您真正的问题是误报率与存储空间的权衡。

你说过

我希望对 800 亿个条目进行会员测试 允许发生大约 100 次冲突,即只能有 100 个条目 给出假阳性结果。

根据定义,地图中的条目不能是阳性。它们是真正的积极因素。

那么问题是“100 个误报占了多少条目 你打算测试吗?”如果答案也是,奇怪的是,800 亿,那么你要求的误报率约为 100/80,000,000,000 = 1/800,000,000,小于 2^-29。

任何近似成员数据结构(如布隆过滤器或布谷鸟过滤器)的最小空间为 n lg 1/ε 位,其中 n 是结构中元素的数量,lg 是以 2 为底的对数,ε 是误报速度。换句话说,每个元素需要超过 29 位才能达到每 800 亿分之 100 的误报率。每个元素 6 位将使您获得 1.56% 的误报率充其量。也就是说,每 800 亿人中有 12.5 亿人,或每 6400 人中有 100 人。

据我所知,没有已知的实用数据结构可以接近实现这一目标。例如,布隆过滤器不会,因为它们每个项目使用超过 lg 1/ε 位。 Cuckoo 过滤器不会,因为它们每个项目至少使用两个额外的元数据位,并且每个项目的位速率随 lg n 扩展。

【讨论】:

  • 我知道我的内存需求会更多。但是,您关于使用单个散列函数并划分位的建议很有趣。您是否曾经实现过这个并发现结果与使用单独的哈希函数得到的结果相似?
  • 是的,我已经实现了这个,并且运行良好。但是,它不适用于低质量的哈希族。这个边距太小,无法包含更完整的答案,但请阅读 vhash、通用散列、SipHash 和类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2010-09-14
  • 2014-12-20
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多