什么是布隆过滤器?

版权声明:本文为博主原创文章,未经博主允许不得转载,博客地址: https://blog.csdn.net/qq_31601743/article/details/89742700

1.问题引入 

考虑这样的一个场景,假设某公司的黑名单中有100亿个URL链接每个URL链接大小是64个字节,问:当给定某个URL,判断它是否在该公司的URL黑名单中

2.Hash表能否解决该问题?

问题一给出,我们就很容易想到一个方法,用Hash表去解决该问题,这个思路确实也是可以的,我们可以把这些属于黑名单的URL通过hash函数映射到hash表中。

这样,每当给定一个新的URL的时候,就可以直接通过hash映射若在表中能找到该URL则给定的URL就属于黑名单中的,若没找到则不属于黑名单。Hash表的存取时间复杂度都是O(1),效率很高,因此我们会对这个方案感到满意。

但是细想一下,总共有100亿个URL耶,而且每个URL市64字节耶,除去空槽还有指针等占用的内存其余的内存至少也得100亿乘以64字节,总过6400亿个字节啊,约等于640G,所以这种方法很浪费内存,如果搞分布式的话,也很浪费机器

因此,使用Hash解决该问题会存在的缺陷是:一次性读进内存构建 HashMap 的时候,会存在有关于资源的各种问题

3.布隆过滤器

3.1基本介绍

好,为解决上述hash表存在的问题,我们引入了布隆过滤器。布隆过滤器其实也是一种集合类型的数据结构,它的优势就是为了解决上述的浪费内存资源的问题。

但是,布隆过滤器会有失误率。这里的失误率是指:URL不属于黑名单的,但是返回的结果可能也属于黑名单。

因此布隆过滤器有以下两种情况

1.给定URL就是属于黑名单,布隆过滤器可以得到这个URL就是属于黑名单的结果

2.URL不属于黑名单,但返回的结果可能也属于黑名单

因此,第2点说的就是上述的失误率

3.2基本原理

布隆过滤器是一个bit 数组,每一个bit它的值是0或1。长这个样子。

我们要把一个URL映射到布隆过滤器中,需要使用多个不同的相互独立的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1。例如有一条黑名单的URL为www.itNiShiLiu.com经过4个相互独立的哈希函数hash1、hash2、hash3、hash4分别生成了2、4、6、8,我们就得到了下图。

好,现在又有一条黑名单URL为www.sb.com经过4个相互独立的哈希函数hash1、hash2、hash3、hash4,分别生成了2、3、5、7,然后就又变成了下图。

因此,如果当有一个URL为www.baidu.com进到布隆过滤器经过哈希函数分别得到1、2、4、6。即使1、2、4、6中2、4、6是为1的,但是第1位为0,所以它不属于黑名单中的成员。但此时有个属于黑名单的URL为www.sb.com进到布隆过滤器中,经过哈希函数返回2、3、5、7,然后发现2、3、5、7这几个位置都为1,因此布隆过滤器返回该URL属于黑名单。但是,如果有另外一个不属于黑名单的URL为www.taobao.com进到布隆过滤器,它经过哈希函数返回的值也为2、3、5、7,同理,布隆过滤器此时会返回该URL属于黑名单,所以这是上文提到的失误率的表现。

3.3失误率

好,我们可以想象以下。

如果数组太小的话,而黑名单列表的数目很多,然后它们每个经过哈希函数后使得数组中的每一位都为1了,即以后如果要判断任何一个URL是否属于黑名单中,那布隆过滤器都会返回该URL是黑名单的结果,这就会造成很高的失误率。

如果哈希函数太多而数组很小的话,那它同样会造成上述结果。

因此,有关于布隆过滤器的相关公式如下,对推导过程感兴趣的可以百度搜索一波,这里不再详细赘述了。

3.4相关公式

定义:

数组大小为m

哈希函数个数为k

失误率为p

1.n为样本量,就相当于上文提到的的100亿个黑名单列表。

2.k为哈希函数的个数

3.求得上面的m和k之后,可以利用以下公式得出布隆过滤器的真实失误率。

4.写在最后

博主之前收藏过一份Spring源码视频教学,想要的同学请在后台回复“ Spring ”,即可获取!

由于篇幅有限,博主后续会细化内容。各位同学有问题的话,请在后台留言,博主将第一时间回复。

猜你喜欢

转载自blog.csdn.net/qq_31601743/article/details/89742700
今日推荐