“它也不是密码学伪随机函数。看到种子后的攻击者可以利用四键关系;本文概率结论针对先固定的键,而不是自适应挑选碰撞的安全游戏。Xor过滤器的精确误报证明还要求非成员指纹在给定全部成员信息后保持均…”
形式陈述
三个位置共同保存一份指纹
输入是预先固定的有限原键集合S,先按完整键去重,令
另取r位指纹f(x)。构建成功后,对每个成员x满足
查询重算三个位置和指纹,只比较这条等式;不等则确定不在S,相等则可能在S。三个位置不同由区间划分保证,不靠“哈希大概不会碰撞”。数组不保存原键,所以肯定答案不精确。[1, §§3.1–3.2]
从图的边扩展到三端点
沿用图的顶点和带身份边思想,把数组位置作为顶点,每个原键作为一条含三个端点的边,得到三部三均匀超图。不同原键即使端点相同也要保留为不同边,不能先按位置三元组去重。
维护各顶点当前度数,把度为1的顶点放入队列。弹出v时重新检查度数;若已不是1就跳过,否则取其唯一尚存边e,记录 (e,v),删除这条边并把它的三个端点度数各减1。新变成度1的顶点入队。v称为这一边的支点。
若队列耗尽时仍有边,报告本轮构建失败,不发布未完成的B。若n条边全部删去,得到剥离次序。初始化全部B为0,逆序处理每个 (e,v),将B[v]设为该边指纹异或另外两位置的当前值。
逆序赋值为何不破坏已经完成的行
边e被剥离时,v只属于e,不属于当时仍未删去的任何其它边。逆序回放到e时,那些当时未删去的边已经赋好值;它们都不使用v,所以改B[v]不会破坏它们。新值又使e的异或等式成立。按逆序归纳,最终每个成员方程都成立,因而没有假阴性。
这份证明解释了支点的作用,也解释了为什么不能照剥离正序任意写值:正序中后来可能改到早先方程使用的位置。未作为支点的位置初值取0即可;正确性不要求B本身逐槽独立随机。
直觉
先找只剩一个未知方程的出口
一条方程有三个数组位置,若其中某位置不再被其它待解方程使用,就可以把这条方程暂时拿走。等其它方程都解决后,回到这个私有位置,用它补齐异或差额。这与完整高斯消元的目标相关,但此处只使用度一结构,不任意组合方程。
查询只读三个r位值。构建时却要看全部边,才能找出安全赋值次序。这是用批量预处理换固定查询工作的静态接口,不能把单键查询便宜理解为单键更新也便宜。
例子与边界
四条方程的完整剥离与回放
取b=3、r=3,四个键的端点和指纹为:
| 键 | 三个位置 | 指纹 |
|---|---|---|
| a | 0、3、6 | 1 |
| b | 0、4、6 | 2 |
| c | 1、3、7 | 4 |
| d | 1、4、8 | 3 |
开始只有位置7和8度为1。按顶点编号入队并处理,可依次剥离 (c,7)、(d,8)、(a,3)、(b,4);其中某些先前入队的顶点会过期,弹出时检查度数即可。
逆序赋值为:B[4]=2;B[3]=1;
例如键c得到
剥不动不等于方程无解
设两个不同键拥有同一三元组(0,1,2)。三个顶点度数都是2,没有度1出口。如果两键指纹同为5,方程实际相同,仍有许多解;若指纹分别为5和6,则同一左边不可能同时等于两数,确实无解。剥离算法对两种情况都报告失败。
因此失败说明没有获得这套剥离构造的证书,不是一般线性系统不可解的判定。可以换位置函数重试或调整容量,也可以改用更复杂的解方程方法,但不能把后者的能力冒充本文算法。
查询误报需要怎样的随机性
固定非成员x。条件化于位置函数、成功剥离次序及全部成员指纹后,B和查询三个位置的异或值都已确定。如果f(x)仍是独立均匀r位串,则按这个概率分布
因此无条件误报率也为
工程中常从少量种子展开位置和指纹,需另证相应模型或接受近似随机假设。本页的确定性检查器接收已给定的三元组和指纹,用来验结构与方程,不把伪随机实验当成理想独立性的证明。
推论与应用
每次构建、重试和输出接口分别记账
度数与关联边可用每点计数及边ID异或维护:插入边e时,在其三个端点把e的ID异或进去;度为1时,这个值恰好就是唯一边ID。移除再异或一次。边ID0合法,必须靠度数判断是否唯一,不能把ID异或值0当作空。每条边只移除一次,最多带来三次新度1入队,故队列工作和逆序赋值合计O(n+m)。构建空间O(n+m)个字;最终查询表只有mr位,另存种子等元数据。
上述线性构建从已去重的键集合及已给定位置、指纹开始,原键去重成本单列。下载器用Python集合检查重复键,该检查在通常散列成本模型下是期望线性,不是任意Python键的最坏线性保证。核心操作按每个位置、边ID、计数和r位值装入常数个RAM字计;长键或多字指纹的读取、哈希求值成本不能略去。
一次成功查询固定读三个位置,最坏O(1)。一次构建失败仍已付O(n+m)。只有明确证明每次独立重试的成功概率至少p₀>0,才可用几何分布得期望构建成本
n=0时,零数组加三位置查询仍会对指纹0给出误报,概率模型下恰为
与商过滤器逐项维护指纹多重集不同,本表构建后不支持任意单键插删。随意改一个位置会影响共享它的其它成员方程;集合变化应整批重建,或另设增量结构并重新证明查询组合规则。
终点任务要求交出剥离序列、每步唯一边检查和逆序数组,再构造同端点两键的“有解但剥不动”与“无解”实例。最后固定一份成功表,穷举非成员的全部r位指纹,验证恰有一种通过;这里测试的是条件概率的有限样本空间,而不是一次经验误报率。
参考资料
[1] Thomas Mueller Graf、Daniel Lemire,Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters,2020,Journal of Experimental Algorithmics25,Article1.5,§§3.1–3.2,Algorithms1–4(作者PDF pp.2–6):三位置方程、剥离和逆序赋值。本文明确限定独立性、重试成功条件与构建失败语义,不把经验容量系数当作全体输入定理。