Bloom-Filter算法 简介
Bloom-Filter算法 其实可以看作 bit-map 的一种扩展。
它把已存在的元素通过多个hash 函数映射到一个 bit 序列,对于每一个元素根据hash函数的结果把相应的 位置置一(这个bit序列通常很长,但是比起记住所有元素它占用的空间是小的)。
在判断一个元素时候已存在的时候,它会把这个元素的多个hash结果对应到bit序列中查看,如果已经全部置为一,那么说明该元素已经存在。
一个Bloom Filter有以下参数:
m | bit数组的宽度(bit数) |
n | 加入其中的key的数量 |
k | 使用的hash函数的个数 |
f |
False Positive的比率 (假阳性) |
为了把错误率控制在 f,共有 n 个元素的集合作 bloom filter 其他参数可以由以下公式来定值:
m =nlg(1/f)*lge (其中
lg 表示以2为底的对数)
k = - ln(f) /
ln(2)
另外对于一个元素非常多的集合要进行 Bloom Filter 操作,必须构造一个返回值范围很大的 hash 函数。可以用 md5 算法生成十六进制的hash值,然后转成十进制:
import hashlib m=hashlib.md5() m.update('123123123123123123') print int(m.hexdigest(), base=16)