如何确定布谷鸟过滤器的尺寸?

Yeh*_*sef 1 data-structures

我需要使用 Cuckoo 过滤器,但我不确定如何调整它的大小。我找到了一个用于布隆过滤器 ( https://hur.st/bloomfilter/ ) 的计算器,我可以通过几种方式进行计算。我可以指定项目的大致数量和所需的误报率,它会告诉我散列函数的大小和数量。我正在为 Cuckoo 过滤器寻找类似的东西,但我还没有找到关于如何找到这些数字的一个或其他说明。

我正在查看 Node 或 Python 实现。似乎定义过滤器的参数是:

  • 过滤器尺寸或容量
  • 桶大小
  • 指纹大小

我想指定元素的数量(例如 100k)和 FPR(例如 .1%)以找出所需的参数。

小智 5

根据原始论文(https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf)中的信息,您需要先选择bucket大小,这可以让您确定指纹大小和容量。存储桶大小基于所需的误报率:

“空间最佳存储桶大小取决于目标误报率桶最大限度地减少了空间" 1

对于您建议的 0.1%,这意味着存储桶大小为 4。

指纹大小取决于桶大小和误报率。

“为了保留目标误报率 ?,过滤器确保 2b/2 f ? ?,因此所需的最小指纹大小约为:f ? log 2 (1/?) + log 2 (2b)” 1

对于 b 桶大小,0.1% 的错误率将需要 ~10 + 3 = 13 位用于指纹。

最后,容量由元素数量除以最大允许负载决定,最大允许负载由铲斗大小决定。

“使用 k = 2 个哈希函数,当桶大小 b = 1(即直接映射哈希表)时,负载因子 ? 为 50%,但使用桶大小 b = 分别增加到 84%、95% 或 98% 2、4 或 8。” 1

所以 100k / 0.95 给你 106k 的容量。

我不知道有任何公式可以为您提供这些答案,因为它们相互依赖,但希望这些步骤中的每一步都有意义。

对于 100k 个元素和 0.1% FPR,即:

  • 过滤器大小为 106k
  • 桶大小为 4
  • 指纹大小 13 位

1 Bin Fan、Dave G. Andersen、Michael Kaminsky、Michael D. Mitzenmacher,Cuckoo Filter: Practical Better Than Bloom,第 10 届 ACM 国际新兴网络实验和技术会议论文集,2014 年 12 月 2-05 日,澳大利亚悉尼[doi>10.1145/2674005.2674994]