BloomFilter原理
- 目的:去重,或判断是否存在
- 原理:使用一个很长的二进制向量(bit向量)和多个哈希函数构成。将元素使用多个哈希函数生成多个哈希值,并映射到bit向量上。
- 优缺点:快速、省空间,但存在一定误判率。常见的方法是建立白名单,存储可能误判的元素
- 如何选择哈希函数个数k,布隆过滤器的长度m(bit)
h:插入元素个数;p:误判率
m
=
−
n
ln
p
(
ln
2
)
2
\ m=-\frac{n\ln p}{(\ln 2)^{2}}\,
m=−(ln2)2nlnp
k
=
m
n
ln
2
\ k=\frac{m}{n}\ln 2\,
k=nmln2
BloomFilter实现
from pybloom import BloomFilter, ScalableBloomFilter
def bloomFilter():
bf = BloomFilter(capacity=10000, error_rate=0.001)
bf.add('test')
print 'test' in bf
sbf = ScalableBloomFilter(mode=ScalableBloomFilter.SMALL_SET_GROWTH)
sbf.add('test')
print 'tests' in sbf
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
import com.google.common.hash.{BloomFilter, Funnels}
def bloomFilter(): Unit = {
val bf = BloomFilter.create(Funnels.unencodedCharsFunnel, 1000l, 0.1)
bf.put("test")
println(bf.mightContain("test"))
}