概念
创建一个m位的位数组(bitmap),先将所有的位数组初始化为0。然后选择k个不同的哈希函数。第i个哈希函数对应的字符串str哈希的结果记为h(i, str),且h(i, str)的范围要在0至m-1。如下图所示。
如何判断字符串是否存在呢?
字符串也经过h(i, str),h(2, str),h(3, str)…哈希映射,检查每一个映射到m位的位数组上是否为1,如果不全为1,则表示一定不存在,否则,不能说明完全存在,有误差率在里面,为什么不能说一定存在呢,没看懂,可看:BloomFilters
关于容错率
既然不能完全表示存在,那么如何计算这个误差率呢?一共有三个参数:k,m,n。
参数 | 表示 |
---|---|
k | 哈希个数 |
m | 位数组大小 |
n | 字符串个数 |
下图表示m/n的结果与k个哈希函数的选择出现的错误率表格。
如上,举例简单说明,如果声明一个为数组大小为2,只传入一个字符串,那么m/n为2,如果选择k个哈希,导致的容错率分别是1.39,0.393,0.400。ok,如果要存1亿个字符串,那么大概为多少呢?
简单计算:如果容错率要求为5.73e-06,那么m/n=32,如果n为1亿的话,那么m为32亿,32亿 / 8/ 1024/1024=381.4697265625MB内存。
还是相当可以的。关于更多的容错率,可以看BloomFilters。
相关的包
Python实现:python-bloomfilter
C实现:pybloomfiltermmap
后续
- 选择使用的包
- 最终效果