Data structures 什么是异或滤波器?

Data structures 什么是异或滤波器?,data-structures,xor,bloom-filter,xor-filter,Data Structures,Xor,Bloom Filter,Xor Filter,有一个相对较新的数据结构(2020年)被称为,它被用作Bloom过滤器的替代品 什么是异或滤波器?与布卢姆过滤器相比,它有哪些优势?它是如何工作的?如果要存储在过滤器中的所有项目都是事先知道的,那么XOR过滤器被设计为Bloom过滤器的替代品。与布鲁姆过滤器一样,它代表了一组近似值,其中不允许出现误报,但允许出现误报 与Bloom过滤器一样,XOR过滤器存储大量位。不过,与Bloom过滤器不同的是,我们认为每个位都是它自己的数组槽,在XOR过滤器中,位被组合成L位序列,对于一些参数L,我们将在后

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


什么是异或滤波器?与布卢姆过滤器相比,它有哪些优势?它是如何工作的?

如果要存储在过滤器中的所有项目都是事先知道的,那么XOR过滤器被设计为Bloom过滤器的替代品。与布鲁姆过滤器一样,它代表了一组近似值,其中不允许出现误报,但允许出现误报

与Bloom过滤器一样,XOR过滤器存储大量位。不过,与Bloom过滤器不同的是,我们认为每个位都是它自己的数组槽,在XOR过滤器中,位被组合成L位序列,对于一些参数L,我们将在后面选择。例如,XOR筛选器可能如下所示:

 +-------+-------+-------+-------+-------+-------+-------+-------+-------+
 | 11011 | 10010 | 11101 | 11100 | 01001 | 10101 | 01011 | 11001 | 11011 |
 +-------+-------+-------+-------+-------+-------+-------+-------+-------+
接下来,我们选择三个散列函数h1、h2和h3,它们与Bloom过滤器一样,将项目散列到数组中的插槽中。这些散列函数允许我们获取一个项目x并计算其表代码,我们通过将点h1(x)、h2(x)和h3(x)中的项目XORing在一起来实现。此处显示了一个示例:

 +-------+-------+-------+-------+-------+-------+-------+-------+-------+
 | 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。使用异或过滤器,我们将x散列到三个位置,通过将它们一起异或,从这些位置导出一个值,最后检查得到的值是否等于f(x)

为了改变异或滤波器的假阳性率,我们只需改变L的值。具体地说,f(x)碰巧匹配h1(x)、h2(x)和h3(x)给出的三个位置的异或的可能性为2-L,因为这是随机L位值匹配另一个位置的概率。因此,为了得到ε的假阳性率,我们只需设置L=log2ε-1

挑战的部分是填表。事实证明,这样做有一个非常简单的策略。要存储n个元素的列表,请创建一个大小为1.23n的表。然后,使用此递归过程:

  • 如果没有剩余的物品可以放置,那么您就完成了
  • 选择一个具有以下属性的项x:x散列到一个表槽(例如,槽k),其他项不会散列到该表槽
  • 从要放置的项目列表中删除x,并递归放置其余项目
  • 将slot k的值设置为一个数字,使得表slot x的XOR散列等于f(x)。(这总是可能的:简单地将其他两个表槽和f(x)的内容异或在一起,然后将其存储在槽k中。)
  • 如果每个表槽都有至少两个散列项,则此过程有一点陷入步骤(2)的可能性,但可以证明,只要使用至少1.23n个表槽,发生这种情况的概率非常小。如果发生这种情况,只需选择新的哈希函数并重试

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

    • 为了降低Bloom过滤器的误报率,我们必须添加更多的函数。具体来说,对于ε的错误率,我们需要使用log2ε-1散列函数。另一方面,异或过滤器总是恰好使用三个哈希函数
    • 因此,Bloom筛选器中的查找通常比XOR筛选器中的查找慢,因为探测到的每个表槽基本上位于随机位置,并且可能导致缓存未命中。使用Bloom过滤器,每个项目有log2ε-1缓存未命中。使用XOR过滤器,每个项有三个缓存未命中
    • 布卢姆过滤器使用更多的空间。错误率为ε的Bloom过滤器需要一个大小为1.44n log2ε-1的表格。异或滤波器具有1.23n个项的数组,每个项的长度为log2ε-1位,总空间使用量为1.23n log2ε-1
    与Bloom过滤器相比,XOR过滤器有一个主要缺点,那就是在构建过滤器之前,必须事先知道要存储在XOR过滤器中的所有项。这与Bloom过滤器形成对比,Bloom过滤器可以在很长一段时间内增量添加项目。除此之外,XOR过滤器还提供了更好的性能和内存使用

    有关XOR过滤器的更多信息,以及它们与Bloom过滤器和Buckoo过滤器在时间和空间方面的比较,请查看,其中解释了它们的工作原理,以及1.23常量的来源以及我们始终使用三个哈希函数的原因