【发布时间】:2021-08-04 05:24:54
【问题描述】:
有一个相对较新的数据结构 (2020),称为 XOR filter,它被用作布隆过滤器的替代品。
什么是异或过滤器?它比布隆过滤器有什么优势?它是如何工作的?
【问题讨论】:
标签: data-structures xor bloom-filter
有一个相对较新的数据结构 (2020),称为 XOR filter,它被用作布隆过滤器的替代品。
什么是异或过滤器?它比布隆过滤器有什么优势?它是如何工作的?
【问题讨论】:
标签: data-structures xor bloom-filter
XOR 过滤器被设计为在预先知道要存储在过滤器中的所有项目的情况下替代 Bloom 过滤器。与 Bloom 过滤器一样,它代表了一个集合的近似值,其中不允许漏报,但允许误报。
与 Bloom 过滤器一样,XOR 过滤器存储大量位数组。然而,与 Bloom 过滤器不同,我们将每个位视为其自己的数组槽,在 XOR 过滤器中,这些位被组合成 L 位序列,对于某些参数 L,我们稍后会选择。例如,XOR 过滤器可能如下所示:
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 11011 | 10010 | 11101 | 11100 | 01001 | 10101 | 01011 | 11001 | 11011 |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
接下来,我们挑选三个散列函数h1、h2和h3 就像 Bloom 过滤器一样,将项目散列到数组中的插槽。这些散列函数让我们获取一个项目 x 并计算它的 表代码,我们通过对点 h 中的项目进行异或运算来完成1(x)、h2(x) 和 h3(x)。此处显示了一个示例:
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 11011 | 10010 | 11101 | 11100 | 01001 | 10101 | 01011 | 11001 | 11011 |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
^ ^ ^
| | |
h3(x) h1(x) h2(x)
Table code for x: 10010 xor 01001 xor 10101
= 01110
为了完成这幅图,我们还需要一个散列函数,称为指纹函数,记为f(x)。指纹识别函数将一个值作为输入并输出一个称为 x 的 指纹 的 L 位数字。要查看 x 是否存储在表中,我们检查 x 的表代码是否与 x 的指纹匹配。如果是这样,我们说 x (可能)在表中。如果不是,我们说 x (肯定)不在表中。
将这个想法与布隆过滤器进行比较会很有帮助。使用 Bloom 过滤器,我们将 x 散列到多个位置,然后通过将所有内容组合在一起从这些位置得出一个值,最后检查我们得到的值是否等于 1。使用 XOR 过滤器,我们将 x 散列到三个位置,通过对它们进行异或运算从这些位置得出一个值,最后检查我们得到的值是否等于 f(x)。
要改变 XOR 过滤器的误报率,我们只需改变 L 的值。具体来说,f(x) 恰好匹配由下式给出的三个位置的 XOR 的可能性h1(x)、h2(x)、h3(x) 是 2-L,因为这是随机 L 位值与另一个值匹配的概率。因此,为了得到ε的误报率,我们只需设置L = log2 ε-1。
具有挑战性的部分是填表。事实证明,这样做有一个非常简单的策略。要存储 n 个元素的列表,请创建一个大小为 1.23n 的表。然后,使用这个递归过程:
如果每个 table slot 至少有两个对其进行哈希处理的项目,则此过程在步骤 (2) 中卡住的可能性很小,但是可以证明,只要您使用至少 1.23n 个 table slots,这种情况发生的极少。如果发生这种情况,只需选择新的哈希函数并重试。
XOR 过滤器与常规 Bloom 过滤器相比有几个优点。
XOR 过滤器相对于 Bloom 过滤器有一个主要缺点,那就是在构建过滤器之前必须提前知道要存储在 XOR 过滤器中的所有项目。这与布隆过滤器形成对比,布隆过滤器可以在很长一段时间内逐步添加项目。但除此之外,XOR 过滤器还提供更好的性能和内存使用率。
有关 XOR 过滤器的更多信息,以及它们在时间和空间方面与 Bloom 过滤器和布谷鸟过滤器的比较,请查看this set of lecture slides,其中解释了它们的工作原理,以及 1.23 常量的来源和原因我们总是使用三个哈希函数。
【讨论】: