布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)

在处理大数据的过程中,往往需要大容量的硬盘,但是现实却很难去提供这样的硬盘供服务器使用。这里就需要提到一个概念“布隆过滤器”,那它到底是干嘛的呢?下面举个例子说明

现在服务器为了做一个搜索引擎,需要用到爬虫爬取一些网站,但是有一些不合法的内容又不能显示出来,那就将这些网站的链接存入黑名单。现在有100亿的URL被服务器存入黑名单了,每个URL64个字节,这样存储容量就达到了640G,一般的服务器也没有那么大内存。现有什么方法去处理呢?

  1. 增加服务器,做成集群

  2. 布隆过滤器

什么是布隆过滤器

那到底什么是布隆过滤器呢,它其实就是一种数据结构,用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)2nlnp

  • 哈希函数的个数

k = l n 2 ∗ m n = 0.7 ∗ m n k = ln2 * \frac{m}{n} = 0.7 * \frac{m}{n} k=ln2nm=0.7nm

  • 真实失误率

( 1 − 1 e n ∗ k m ) k (1-\frac{1}{e}^\frac{n*k}{m})^k (1e1mnk)k

布隆过滤器缺点
  1. 失误率无法避免,但是能通过其他方式避免,比如新建一个白名单。

  2. 一般情况下无法从布隆过滤器中删除元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值