大白话 强大的布隆过滤器算法-极大降低存储空间

     “宁可错杀三千,绝不放过一个”,这是布隆过滤器的失误类型金句。

1、什么是布隆过滤器

       了解熟悉布隆过滤器,先从了解hash函数开始。最简单说,一个数据经过hash函数计算后,会得到另一个输出值。hash函数能给你的保证就是,相同的输入值,经过计算后,一定得到相同的输出值。但是不给你保证不同的输入值,会得到不同的输出值。梳理一下,hash函数的规则如下:

        1、当给哈希函数传入相同的输入值时,返回的输出值一定相同。

        2、当给哈希函数传入不同的输入值时,返回的输出值,可能不同,也可能相同。

        3、评判一个哈希函数优劣,就是看对不同的输入值,返回的输出值是否均匀的分布,最好的哈希函数,就是尽可能保证不同的输入值,能得到尽可能多不同的输出值。也就是完美的哈希函数,就是不同的输入,得到不同的输出,完全1对1。

        典型的哈希函数有MD5,SHA1,SHA2等算法。

        布隆过滤器,它类似一个聚合的hash函数。我们先说原理,待会举例说一下,尽可能通俗易懂(坚信最好的理解,也就是最白话、最简单的理解)。

        假设有个长度为m=1024 的bit 数组,也就是一个占用空间1kb的数组。很明显bit数组的值只有0和1。我们有个哈希函数,任何的输入值(字符串、boolean、对象),经过这个hash函数计算后,得到的输出是个int整数(占用16位,这里其实为了了解原理,不用太关心占位大小,大家可以忽略不关注)。

        布隆过滤器,就是利用一个bit数组,多个不同的hash函数,比如我们有10个不同的hash函数,我给一个输入值98,经过这是个hash函数计算后,得到输出值是,打个比方,方便大家理解,刚好就是1024,1025,1026,1027,1028,1029,1030,1031,1032,1034,1035。然后这10个输出值,我们分别对m也即是1024进行取模计算,得到0,1,2,3,...9,那么,我们就把数组0~9的位置涂黑,其实就是变成1。也就是输入值98,在bit数组里面,用位置0~9,是1来表示。下一个输入109,可能就把11~20这10个位置涂黑变成1。

        这样的实现就是,比如我们有10亿个网址,就是黄赌毒的网址,我们要做个黑名单过滤。如果存入到内存或者数据库,肯定需要很大的存储空间。但我们就是先慢慢一个个读取这10亿个url,建立布隆过滤器,可以选择用一个1mb或者1kb的bit数组放在内存。当有个url过来,我们进行多个hash计算,如果这个url是在黑名单里,那么过滤器的bit数组相应的位置一定都是1被涂黑的。如果这个url计算的位置上有一个是空白,未被涂黑,那么它100%就不是黑名单之属,可以放行。

     但是有个缺点也是失误,比如bit数组比较小,几个url白名单计算后,全部都是黑的了。那么任何url过来计算的位置,都是黑的,就被错误认为是黑名单,这就造成了开头说的“宁可错杀三千,绝不放过一个”,这样一个火爆脾气造成的失误。非常严格。所以后文的使用场景就有得分析了。

2、布隆过滤器适合使用的场景

       布隆过滤器优缺点都很明显,优点就是可以利用算法优势,使用计算,极大降低存储空间。缺点就是有失误率,不在过滤器原始表的数据,也可能被计算成原始表数据之一。

        这样理解可能不是很好,换个说法:布隆过滤器,目标就是要基于过滤器已存储生成的原始元数据,进行比较过滤,如果是在原始元数据集合里面的,一定会被发现。基于这个特点,我们就可以做黑名单这样的过滤器,存在黑名单原始元数据的,在布隆过滤器里,是一定不能通过刷洗的。

         所以,这个算法正确的使用场景是,利用它进行过滤屏蔽-禁止通行。黑名单过滤就是正确的使用场景,如果用来做白名单,那就进入了过滤器的失误区,几乎不可能做100%准确。比如白名单有原始数据1,2,3,4。数据44的计算也可能和4存在过滤器中有相同的值表现,44会被误认为是4,白名单要做放行,那就放错了。所以,布隆过滤器核心正确的使用就是进行过滤禁止,进行正确的否定。否定才是它所擅长的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值