布隆过滤器BloomFilter

阅读更多

布隆过滤器是用来判断一个元素是否出现在给定集合中,具有快速,比哈希表更节省空间等优点,而缺点在于有一定的误识别率。布隆过滤器能够明确指出元素绝对不存在于一个集合中,或是可能存在于一个集合中。

 

布隆过滤器以下面的方式工作:

        添加元素到过滤器。

        对元素进行几次哈希运算,当索引匹配哈希的结果时,将该位设置为1的。

 

原理:S集合中有n个元素,利用k个哈希函数,将S中的每个元素映射到一个长度为m的位数组B中不同的位置上,这些位置上的二进制数均置为1,如果待检测的元素经过这k个哈希函数的映射后,发现其k个位置上的二进制数不全是1,那么这个元素一定不在集合S中,反之,该元素可能是S中的某一个元素。

 

Guava 11.0版本中增加了BloomFilter类,它使用了Funnel和Sink的设计,增强了泛化的能力,使其可以支持任何数据类型,其利用murmur3 hash来做哈希映射函数,不过它底层并没有使用传统的java.util.BitSet来做bit数组,而是用long型数组进行了重新封装,大部分操作均基于位的运算,因此能达到一个非常好的性能。

 

public class BloomFilterTest {
	public static void main(String[] args) {
		//预期插入数, 允许的错误率
		BloomFilter filter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 1000, 0.0001);
		filter.put("121");
		filter.put("122");
		filter.put("123");
		System.out.println(filter.mightContain("12321")); //元素可能存在
		
		BloomFilter filter2 = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 1000, 0.0001);
		filter2.put("aba");
		filter2.put("abb");
		filter2.put("abc");
		filter2.putAll(filter);
        System.out.println(filter2.mightContain("123"));
	}
}

 

你可能感兴趣的:(布隆过滤器BloomFilter)