布隆算法

博客讲述了在爬虫URL去重问题上,从HashSet方案因占用空间过大而转向Bitmap数据结构。尽管Bitmap大幅减少了内存使用,但Hash冲突可能导致误判。为解决这个问题,引入了布隆过滤器,通过多个Hash函数降低冲突概率,有效判断URL是否重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片

 

 

图片

 

 

图片

 

 

图片

 

 

两周之前——

 

 

 

图片

 

 

图片

 

 

 

图片

 

 

爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中。

 

 

 

图片

 

 

但是,这其中涉及到一个小小的问题......

 

 

图片

 

 

图片

 

 

URL去重方案第一版:HashSet

 

创建一个HashSet集合,把每一个URL字符串作为HashSet的key插入到集合当中,利用HashSet的Key唯一性来对URL做去重。

 

 

 

图片

 

 

这个方案看似没毛病,但是经过几轮压测之后......

 

 

 

图片

 

 

每一个URL按照20字节来算,一亿个URL就是20亿字节,也就是大约占了1.8G以上的空间。这么大的HashSet集合显然是不可取的。

 

于是小灰又思考了一番......

 

 

 

图片

 

 

URL去重方案第二版:Bitmap

 

Bitmap是一种节省空间的数据结构,不太了解的朋友可以看看往期的相关文章:

 

漫画:Bitmap算法 整合版

 

具体怎么做呢?获取每一个URL的HashCode,根据HashCode的值来插入到Bitmap的对应位置。如果要插入位置的值已经是1,说明该URL已重复。

 

 

图片

 

 

使用Bitmap以后,每一个Url只占了1个Bit,一亿个Url占约12MB。假设整个Bitmap的空隙比较多,额外空间占90%,总空间也不过是120MB,相比HashSet来说大大节省了内存空间。

 

这个方案貌似好了很多,可是......

 

 

 

图片

 

 

String的Hashcode方法虽然尽可能做到均匀分布,但仍然免不了会有冲突的情况。HashCode的冲突意味着什么呢?意味着两个原本并不相同的Url被误判为重复Url。

 

 

 

图片

 

 

 

———————————————

 

 

图片

 

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

听起来有点绕,我们来详细描述一下:

 

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

 

 

图片

 

 

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

 

 

图片

 

 

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

 

 

图片

 

 

图片

 

 

 

图片

 

 

具体怎样映射呢?流程如下:

 

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

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

图片

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值