布隆过滤器(Bloom Filter)
在处理大数据的过程中,往往需要大容量的硬盘,但是现实却很难去提供这样的硬盘供服务器使用。这里就需要提到一个概念“布隆过滤器”,那它到底是干嘛的呢?下面举个例子说明
现在服务器为了做一个搜索引擎,需要用到爬虫爬取一些网站,但是有一些不合法的内容又不能显示出来,那就将这些网站的链接存入黑名单。现在有100亿的URL被服务器存入黑名单了,每个URL64个字节,这样存储容量就达到了640G,一般的服务器也没有那么大内存。现有什么方法去处理呢?
-
增加服务器,做成集群
-
布隆过滤器
什么是布隆过滤器
那到底什么是布隆过滤器呢,它其实就是一种数据结构,用bit类型做成的map,能够高效的插入查询,返回一个01的结果。但是它也有缺点,就是存在失误率,这是无法避免的。
如何实现
public static void main(String[] args){
int[] arr = new int[1000];//4*8*1000bit
int index = 30000;
//数组中第几个
int intIndex = index/32;
//第几个bit
int bitIndex = index%32;
arr[intIndex] = (arr[intIndex]|(1<<bitIndex));
}
回到刚刚的问题,该如何存储100亿个URL呢,设置k个Hash函数,将每个URL计算得出的值放到对应的bit上设置为1。那该如何去查呢?将需要查询到URL经过这k个Hash函数计算的值查看数组中,如果都为1则返回存在,否则不存在。
如何选择哈希函数和布隆过滤器长度
当期望的失误率越小,数组就需要越长。
- 数组大小
其中m为数组大小单位为bit,n为样本量,p为失误率
m = − n ∗ l n p ( l n 2 ) 2 m = - \frac{n*lnp}{(ln2)^2} m=−(ln2)2n∗lnp
- 哈希函数的个数
k = l n 2 ∗ m n = 0.7 ∗ m n k = ln2 * \frac{m}{n} = 0.7 * \frac{m}{n} k=ln2∗nm=0.7∗nm
- 真实失误率
( 1 − 1 e n ∗ k m ) k (1-\frac{1}{e}^\frac{n*k}{m})^k (1−e1mn∗k)k
布隆过滤器缺点
-
失误率无法避免,但是能通过其他方式避免,比如新建一个白名单。
-
一般情况下无法从布隆过滤器中删除元素。