背景:
判断一个元素是否在一个集合中,可以使用数组、哈希表(哈希表的存储效率一般只有50%)。Bloom filter只需要哈希表1/8 到 1/4 的大小就能解决同样的问题,但是会有一定的误识别率,可以设置白名单。
应用举例:
存储一亿个垃圾邮件地址,监测新邮件是否是垃圾邮件时,将新邮件在垃圾邮件地址列表中查找:
1、建立bloom filter:
建立一个十六亿二进制bit的向量,全部置0;
对于每一个电子邮件地址X,用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, ...,g8,把这八个位置的二进制全部设置为1;
如此将一亿个地址都置位;
2、检测一个可疑垃圾邮件地址是否在已存储的地址列表中:
用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指纹 s1,s2,...,s8,然
后将这八个指纹对应到布隆过滤器的八个二进制位,分别是t1,t2,...,t8。如果 Y 在黑名单中,t1,t2,..,t8 对应的八个二进制一定是1。
3、对于识别误伤,可以使用白名单作为补充
BLOOM FILTER —读数学之美
最新推荐文章于 2020-11-19 20:47:16 发布