布隆过滤器揭秘 让URL黑名单存储从640GB增加到35.88GB!

1.引言

大家好,我是小米,一个热爱分享技术的小同伴。当天我们来聊一聊在实践上班中如何经常使用布隆过滤器(Bloom Filter)来处置大规模URL黑名单的存储和查征询题。

2.疑问背景

假定我们有一个规模到达100亿的黑名单URL汇合,每个URL的长度为64字节。如何高效地存储和查问这个黑名单呢?

3.散列表方法

我们先思考一下惯例的散列表方法。假设经常使用HashMap来存储这些URL:

显然,这样的存储需求是无法行的,由于它对内存的要求太高。

4.布隆过滤器引见

这时刻,我们可以引入布隆过滤器,它是一种高效的概率型数据结构,用于检测一个元素能否属于一个汇合。布隆过滤用具备以下特点:

5.布隆过滤器原理

布隆过滤器由一个很长的二进制位数组和一系列随机映射函数(哈希函数)组成。

拔出元素

当一个元素参与布隆过滤器时,口头以下步骤:

查问元素

查问一个元素能否在布隆过滤器中时,口头以下步骤:

6.计算布隆过滤器参数

为了更好地理解布隆过滤器的存储效率,我们须要计算以下参数:

假定我们准许的误判率为0.01%,我们可以经常使用以下公式来计算m和K:

其中,n是汇合中的元素数量,p是准许的误判率。

详细计算如下:

代入公式:

经过计算,我们得出位数组的长度为287亿bit(约合35.88GB),须要20个哈希函数。这样,布隆过滤器的内存占用从原来的640GB大幅增加到了35.88GB,且具备较高的查问效率。

7.布隆过滤器的成功

上方是布隆过滤器的Java成功,包含初始化、参与元素和查问元素的代码。

代码说明

这个成功经常使用了MD5哈希函数,可以依据需求选用其余哈希函数。经过调整位数组大小和哈希函数数量,可以在存储效率和误判率之间取得平衡。

布隆过滤器作为一种高效的概率型数据结构,能够在大规模数据集上成功高效的存储和查问,特意实用于URL黑名单这样的场景。经过正当地选用位数组长度和哈希函数数量,我们可以在保障较低误判率的前提下,大幅增加内存经常使用。

您可能还会对下面的文章感兴趣: