布隆算法的介绍及应用场景

需求背景:不安全的网页黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B,现在想要实现一种网页过滤系统,可以根据网页的URL判断该网页是否在黑名单上,请设计该系统。

一般可能会首先想到利用HashSet的不可重复性,但是URL上亿的话所占内存空间会非常大。另外一种,就是采用BitMap这种数据结构。具体做法就是获取每一个URL的HashCode,然后根据它来插入到Btimap的对应位置。如果值是1,说明存在这个URL。

图片来自:公众号 程序员小灰
 

使用Bitmap以后,每一个Url只占了1个Bit,一亿个Url占约12MB。假设整个Bitmap的空隙比较多,额外空间占90%,总空间也不过是120MB,相比HashSet来说大大节省了内存空间。String的Hashcode方法虽然尽可能做到均匀分布,但仍然免不了会有冲突的情况。HashCode的冲突意味着什么呢?意味着不是黑名单的URL被误判为黑名单上的。

此时,引出布隆算法,它是一种以BitMap集合为基础的排重算法,应用场景有Url的排重,垃圾邮箱过滤等等。

1.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。

2.把第二个URL也按照三种Hash算法,分别生成三个不同的Hash值。

3.依次比较每一个Hash结果,只有当全部结果都相等时,才判定两个URL相同。

假设标准 HashCode 的重复几率是 0.01%,那么3个Hash结果同时重复的几率就是 0.01%^3=0.00000..1%。布隆算法会把每一个Hash结果都映射到同一个Bitmap上面。

1.创建一个空的Bitmap集合。

2.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。

3.分别判断5,17, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把5,17,9的对应位置设置为1。

4.把第二个URL按照三种Hash算法,分别生成三个不同的Hash值。

5.分别判断10,12, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把10,12, 9 的对应位置设置为1。

6.把第三个URL按照三种Hash算法,分别生成三个不同的Hash值。

7.分别判断4,16, 11 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把4,16, 11 的对应位置设置为1。

8.把第四个URL按照三种Hash算法,分别生成三个不同的Hash值。

9.分别判断5,17, 9 在Bitmap的对应位置是否为1。判断的结果是 5,17, 9 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url

但是,布隆算法也有一定几率会造成误判,如下:

1.URL按照三个Hash算法得到三个结果。

2.分别判断10,12, 17 在Bitmap的对应位置是否为1。判断的结果是 10,12, 17 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url

这种情况就是误判,可以看出布隆算法虽然极力降低了Hash冲突的几率,但是仍然有一定的误判率,为了减小误判率,可以让Bitmap的空间更大一些,单个Url所做的Hash更多一些(一般是8次),总之是在空间和准确率上做出取舍。

既然使用同一个Bitmap会出现误判,为什么不让每一种Hash算法的结果对应一个独立的Bitmap?那样的话,占用的空间也会相应增加几倍,反而不如用HashSet

 

来源:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653191316&idx=1&sn=6b407704c99bda58440e97a2d6dd6ee9&chksm=8c990e4ebbee8758bf207b7fed8267bc1bda957f5864c00b467e2de6f0ae93563740b5527f25&mpshare=1&scene=1&srcid=0725JrPxcSV7PBAwp2AF4pPT&sharer_sharetime=1564044982930&sharer_shareid=7480a831d53c39a325d5b968ab7cb218&key=fe048f5ad4fa1bcf53e6c18d0e56178d7c4d44919f1eab04fdd0109cd720e5e237c644bf14bb8adc1f47c458e6058d6e723d054cc66339bdd5fb4b2d03eec4c84810a353afc5ce2174645b97de9be593&ascene=1&uin=MzM4NDEwMDc1&devicetype=Windows+7&version=62060833&lang=zh_CN&pass_ticket=8Ji5kQrDjy2daU8KZoBRJ44%2FQ%2B69CaB7nqnMEgjm7udapUb77oFSKQHvgoMcPiiz

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值