大家好,我是小米,一个热爱分享技术的小同伴。当天我们来聊一聊在实践上班中如何经常使用布隆过滤器(Bloom Filter)来处置大规模URL黑名单的存储和查征询题。
假定我们有一个规模到达100亿的黑名单URL汇合,每个URL的长度为64字节。如何高效地存储和查问这个黑名单呢?
我们先思考一下惯例的散列表方法。假设经常使用HashMap来存储这些URL:
显然,这样的存储需求是无法行的,由于它对内存的要求太高。
这时刻,我们可以引入布隆过滤器,它是一种高效的概率型数据结构,用于检测一个元素能否属于一个汇合。布隆过滤用具备以下特点:
布隆过滤器由一个很长的二进制位数组和一系列随机映射函数(哈希函数)组成。
当一个元素参与布隆过滤器时,口头以下步骤:
查问一个元素能否在布隆过滤器中时,口头以下步骤:
为了更好地理解布隆过滤器的存储效率,我们须要计算以下参数:
假定我们准许的误判率为0.01%,我们可以经常使用以下公式来计算m和K:
其中,n是汇合中的元素数量,p是准许的误判率。
详细计算如下:
代入公式:
经过计算,我们得出位数组的长度为287亿bit(约合35.88GB),须要20个哈希函数。这样,布隆过滤器的内存占用从原来的640GB大幅增加到了35.88GB,且具备较高的查问效率。
上方是布隆过滤器的Java成功,包含初始化、参与元素和查问元素的代码。
代码说明
这个成功经常使用了MD5哈希函数,可以依据需求选用其余哈希函数。经过调整位数组大小和哈希函数数量,可以在存储效率和误判率之间取得平衡。
布隆过滤器作为一种高效的概率型数据结构,能够在大规模数据集上成功高效的存储和查问,特意实用于URL黑名单这样的场景。经过正当地选用位数组长度和哈希函数数量,我们可以在保障较低误判率的前提下,大幅增加内存经常使用。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/8407.html