布隆过滤器(Bloom Filter)
定义: 一种比较巧妙的概率型数据结构,由一个很长的二进制向量(bit数组) 和 一系列哈希映射函数组成;
根据查询结果可以用来告诉你,某样东西一定不存在或者可能存在,这句话是该算法的核心;
作用: 布隆过滤器可以用于检索一个元素是否在一个集合中;
优点: 占用空间更少,高效地插入和查询;
缺点: 其返回的结果是概率性的,存在一定的误差,数据只能插入不能删除。
应用场景:
- hbase中用于快速查找?????
- 网页URL的去重;
- 垃圾邮件的判别;
- 集合重复元素的判别;
- 。。。。。。。。。
布隆过滤器数据结构
以hadoop中的bloom过滤器为例:
- 以下实例表示:字节向量的长度是200000000,3个哈希映射函数,采用类型为1的哈希算法;
//参数一(vector):字节向量的长度; 参数二(nbHash):哈希算法的长度; 参数三(hashType):哈希算法的类型
val bloomFilter = new BloomFilter(200000000, 3, 1)
- 布隆过滤器在还没有任何元素映射的时候,字节向量(字节数组)中的每一个位置都为0;
- 若有一个元素在映射到该布隆过滤器中时,会使用3个不同的哈希函数生成3个hash值;字节向量(字节数组)中这三个hash值对应的位置将会被标记为1;
- 若一个元素 “小黑” 经过3种哈希函数生成3个hash值所对应字节向量的位置,只要有一个位置上为0,则可以确定该元素不存在;
- 若一个 “小黄” 经过3种哈希函数生成3个hash值所对应字节向量的位置全为1,则只能说明该元素可能存在。
- 随着增加的元素越来越多,被置为 1 的 bit 位也会越来越多,这样某个元素 “小蓝” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他元素置为了 1 ,那么程序还是会判断 “小蓝” 这个元素存在,这就产生了误差。
应用实战:
利用布隆过滤器减少磁盘 IO 或者网络请求,因为一旦一个值必定不存在的话,我们可以不用进行后续昂贵的查询请求。(hbase中的应用)
布隆过滤器误判率计算公式
- 式中:m:字节向量的长度; n: 预期映射的元素的长度; k:哈希函数的个数;
降低误判率的方法:
- 哈希函数的过多使布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;
- 哈希函数太少的话,误报率会变高。一般为3~5 为宜;
- 布隆过滤器的长度会直接影响误判率,布隆过滤器越长其误判率越低;