谁对bloom filter比较熟悉?# JobHunting - 待字闺中
A*e
1 楼
吴军的讲解:
布隆过滤器是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和
一系列随机映射函数。我们通过上面的例子来说明起工作原理。
假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字
节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址 X,我们
用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8
)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数
g1, g2, ...,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个
email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。
现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单
中。我们用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指
纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,
t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这
样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。
问题:
1. 一亿个邮件地址,为何要十六亿的位图?
2. 这八个随机数生成器指的是散列函数?如何保证这些函数相互独立?比如一个随机
数生成器可以加参数,当八个用。但这八个结果显然是相关的。
布隆过滤器是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和
一系列随机映射函数。我们通过上面的例子来说明起工作原理。
假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字
节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址 X,我们
用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8
)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数
g1, g2, ...,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个
email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。
现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单
中。我们用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指
纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,
t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这
样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。
问题:
1. 一亿个邮件地址,为何要十六亿的位图?
2. 这八个随机数生成器指的是散列函数?如何保证这些函数相互独立?比如一个随机
数生成器可以加参数,当八个用。但这八个结果显然是相关的。