布隆过滤器
简介
- 布隆过滤器主要用于判断一个元素是否在集合中,常见的如垃圾邮件过滤的黑白名单方法、爬虫的网址判重模块等。
- Hash表也可以用于判断元素是否在集合中,但是布隆过滤器只要Hash表的1/4或1/8甚至更少的空间复杂度就能完成同样的问题。
- 布隆过滤器存在一定的误报率,通过设计bitArray的大小可以将误报率控制在极低水平。使用布隆过滤器一定是在有一定容错概率的情况下。
布隆过滤器的设计
假设数据查询的数据量为n,允许的失误率p
- 长度为m的BitArray,二进制数组,里面存放的数据都是0和1
- k个相互独立的hash函数
添加元素
- 初始时将BitArray中的元素全部置为0
- 将单条数据str,分别用k个hash函数计算出对应的hash值,将这k个hash值再对m进行取模运算,得到数据h1,h2,……hk.
- 将BitArray h1、h2、……hk位置上的值置为1
- 每条数据都重复2、3步骤。
查询元素是否在集合中
- 将要查询的数据分别用k个hash函数计算出对应的hash值,然后对m进行取模运算,得到数据h1 h2 …… hk.
- 判断BitArray h1、h2、……、hk位置上的值是否全部都是1,如果全为1则表示数据已经在集合中,如果不全为1则表示数据不在集合中。
n k m p 之间的关系
- 样本个数n和允许失误概率p可以求出m
m=−n∗lnp(ln)2
根据m可以求出k,hash函数的个数
k=ln2∗mn=0.7∗mn由于在计算m和k的过程中都是向上取整的,失误率会降低,可以根据下面的公式计算出具体的失误率:
p=(1−e−(nkm))k
求出真实的失误率p