用来判断海量数据中是否存在指定值。
将容器中的所有值求hashcode然后根据hashcode找,类似于hashmap,但不同的是这里只比较hash值,没有hash值相同之后的进一步精确匹配。 所以出现hash碰撞时,不能确定是否真的存在,此时可以使用不同的hash算法对数组中元素设置多个值,然后对每个值进行匹配。所以只要算法够多,误判几率就越低。
Hbase就使用布隆过滤器来找rowkey,也会有误判的情况,本来没有,但返回有,此时无非就是遍历一个hfile而已,白搜了一个文件。可以接受。 新老用户判断 爬虫
BloomFilter也是相当于一个容器,只不过这个容器里会对放入的元素求多个hashcode,然后把这些hashcode作为这个元素的下标。所以使用BloomFilter时,先创建BloomFilter对象,然后把元素put进去。然后就可以使用mightContain()判断是否存在了。
scala代码中一定要注意,BloomFilter.create[String]要加泛型,不然会报trying to do lub/glb of typevar ?Thttps://stackoverflow.com/questions/40585069/guava-bloomfilter-error-in-scala-compiler-trying-to-do-lub-glb-of-typevar-t
import com.google.common.base.Charsets import com.google.common.hash.{BloomFilter, Funnels} object 布隆过滤器 { def main(args: Array[String]): Unit = { // 样本 val arr: Array[String] = Array("asdf", "qw", "qwe", "qwer", "aa", "zxc", "zz", "bb") // 创建bloomFilter,类型、可能的数据量(必须比实际数据量大,但一般都是实际量的10倍以上)、误判几率 val bloomFilter: BloomFilter[String] = BloomFilter.create[String](Funnels.stringFunnel(Charsets.UTF_8), 100000, 0.000001) // 将样本中元素put到bloomFilter arr.foreach(bloomFilter.put(_)) // 判断指定元素是否存在 println(bloomFilter.mightContain("qw")) println(bloomFilter.mightContain("123")) } }