Search CTRL + K

Bloom Filter Variant

基础 布隆过滤器 中,不同哈希函数需要修改同一个位图,这导致:

于是 2004 年提出 布隆过滤器变体(Bloom Filter Variant) 以解决这两个问题。[1]

原理

该布隆过滤器变体由两部份组成:

其中,M 位的位图被 k 等分,每个切片(slice)长度为 m,即 m=Mk

与基础 布隆过滤器 不同的是,每个哈希函数独占一个 slice,不同哈希函数不会重复设置位。

这种变体更健壮,并且支持并发处理。

应用

哈希函数数量(k)为多少时,错误率(P)最低,此时为多少?

插入 1 个元素后,某一个位被置 1、置 0 的概率为 1m11m

当插入 n 个元素后,某一位被置 0、置 1 的概率是 (11m)n1(11m)n

同样使用自然对数 e 的计算公式

limx(11x)x=e

插入 n 个元素后某一位被置 1 的概率可以简化为

p1enm

于是得到

nmln(1p)

又由公式 M=kmP=pk,我们推导出 m=Mln(p)ln(P),因此有

nMln(p)ln(1p)ln(P)

对于给定的纳伪率 P 和位图大小 M,当 p=12 时 n 取到最大值,此时能容纳最多的元素。p 代表一个 slice 的饱和程度,我们得知 slice 半饱和时最好,对于 p=12 我们可以简化上面的公式为

nM(ln(2)2)|ln(P)|

P 是给定的纳伪率,因此对于这个布隆过滤器变体而言,可以容纳的元素数量 n 是和位图大小 M 呈线性关系。

最后由 P=pkp=12 我们推导出最合适的哈希函数个数为

k=log21P

实际应用中如何使用布隆过滤器变体?

首先获取/估算插入个数(n),并固定可容忍的错误率(P),然后通过公示计算:

  1. 根据公式 k=log21P 计算 k 的值
  2. 根据公式 mn|ln(P)|kln2(2) 计算 m 的值

  1. F. Chang, W. chang Feng, K. Li, Approximate caches for packet classification, in: Proc. of the 23rd Annual Joint Conference of the IEEE Computer and Communications Societies (IN- FOCOM 2004), IEEE, 2004. ↩︎