【问题标题】:What is an XOR filter?什么是异或过滤器?
【发布时间】:2021-08-04 05:24:54
【问题描述】:

有一个相对较新的数据结构 (2020),称为 XOR filter,它被用作布隆过滤器的替代品。

什么是异或过滤器?它比布隆过滤器有什么优势?它是如何工作的?

【问题讨论】:

    标签: data-structures xor bloom-filter


    【解决方案1】:

    XOR 过滤器被设计为在预先知道要存储在过滤器中的所有项目的情况下替代 Bloom 过滤器。与 Bloom 过滤器一样,它代表了一个集合的近似值,其中不允许漏报,但允许误报。

    与 Bloom 过滤器一样,XOR 过滤器存储大量位数组。然而,与 Bloom 过滤器不同,我们将每个位视为其自己的数组槽,在 XOR 过滤器中,这些位被组合成 L 位序列,对于某些参数 L,我们稍后会选择。例如,XOR 过滤器可能如下所示:

     +-------+-------+-------+-------+-------+-------+-------+-------+-------+
     | 11011 | 10010 | 11101 | 11100 | 01001 | 10101 | 01011 | 11001 | 11011 |
     +-------+-------+-------+-------+-------+-------+-------+-------+-------+
    

    接下来,我们挑选三个散列函数h1h2h3 就像 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 的表。然后,使用这个递归过程:

    1. 如果没有要放置的项目,您就完成了。
    2. 选择具有以下属性的项目 x:x 散列到没有其他项目散列到的表槽(例如槽 k)。
    3. 从要放置的项目列表中删除 x,然后递归放置剩余的项目。
    4. 将槽 k 的值设置为一个数字,使得表槽 x 的 XOR 哈希值等于 f(x)。 (这总是可能的:只需将其他两个表槽和 f(x) 的内容异或,然后将其存储在槽 k 中。)

    如果每个 table slot 至少有两个对其进行哈希处理的项目,则此过程在步骤 (2) 中卡住的可能性很小,但是可以证明,只要您使用至少 1.23n 个 table slots,这种情况发生的极少。如果发生这种情况,只需选择新的哈希函数并重试。

    XOR 过滤器与常规 Bloom 过滤器相比有几个优点。

    • 为了降低布隆过滤器的误报率,我们必须添加更多功能。具体来说,对于 ε 的错误率,我们需要使用 log2 ε-1 哈希函数。另一方面,XOR 过滤器总是使用三个哈希函数。
    • 因此,Bloom 过滤器中的查找通常比 XOR 过滤器中的查找速度慢,因为探测到的每个表槽基本上都位于随机位置,并且可能会导致缓存未命中。使用 Bloom 过滤器,我们每个项目都有 log2 ε-1 个缓存未命中。使用 XOR 过滤器,我们每个项目有 3 个缓存未命中。
    • 布隆过滤器使用更多空间。一个错误率为 ε 的布隆过滤器需要一个大小为 1.44n log2 ε-1 的表。 XOR 过滤器有一个包含 1.23n 个项目的数组,每个项目的长度为 log2 ε-1 位,总空间使用量为 1.23n log2 ε-1.

    XOR 过滤器相对于 Bloom 过滤器有一个主要缺点,那就是在构建过滤器之前必须提前知道要存储在 XOR 过滤器中的所有项目。这与布隆过滤器形成对比,布隆过滤器可以在很长一段时间内逐步添加项目。但除此之外,XOR 过滤器还提供更好的性能和内存使用率。

    有关 XOR 过滤器的更多信息,以及它们在时间和空间方面与 Bloom 过滤器和布谷鸟过滤器的比较,请查看this set of lecture slides,其中解释了它们的工作原理,以及 1.23 常量的来源和原因我们总是使用三个哈希函数。

    【讨论】:

    • 感谢另一个详细而精彩的解释!
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2021-12-19
    • 2011-10-13
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多