讲解一下布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

一、认识布隆过滤器

1、概念

布隆过滤器其实就是加快判定一个元素是否在集合中出现的方法。比如说在一个大字典中,要查找某个单词是否存在,于是我们就可以使用布隆过滤器,快速高效省时省力。

这里有一个考察点,那就是布隆过滤器只能判定一个元素不在集合里面,不能判断存在,什么意思呢!就是说一个苹果不在篮子里,这个我可以通过布隆过滤器知道,但是一定在篮子里嘛?这个通过布隆过滤器我是不能判定的。

下面通过原理就能理解这个了。

2、原理

先举一个例子,在我们身边充斥着各种各样的XX网站,为了不毒害我们祖国的花朵,于是国家网警就开始对这些网站进行割除过滤,问题来了,这些网站的地址其实是不停的更换的,这些垃圾网站和正常网站加起来全世界据统计也有几十亿个。因此就会带来如下的问题:

(1)网站数量太多,存储起来比较麻烦。一个地址最起码有32个字节,一亿个地址就需要1.6G的内存。

(2)一个一个比较,太费时间了。

因此布隆过滤器被设计出来了,他是如何做到高效的呢?本质上其实就是一个HASH映射器。他的底层其实是一个超大的二进制向量和一系列随机映射函数。现在我们按照之前的那个例子,我们存储1亿个垃圾网站地址。

(1)第一步:建立一个32亿二进制(比特),也就是4亿字节的向量。全部置0。

(2)第二步:网警用八个不同的随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。

(3)第三步:用一个随机数产生器 G 把这八个信息指纹映射到 1 到32亿中的八个自然数 g1, g2, …,g8。

(4)第四步:把这八个位置的二进制全部设置为一。

OK,有一天网警查到了一个可疑的网站,想判断一下是否是XX网站,于是就开始检查了。通过同样的方法将XX网站通过哈希映射到32亿个比特位数组上的8个点。如果8个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。

注意:现在你可能会发现一个问题,如果两个XX网站通过上面的步骤映射到了相同的8个点上,或者是有一部分点是重合的,这时候该怎么办?于是就出现了误报,也就是说A网站在12345678个点上全部置1,B网站通过同样的方式在23456789上全部置1,这时候B网站来了是不能确定是否包含的。这个逻辑相信各位都理解。这个是最基础的面试问题。

3、误报率

这一小节是稍微高级一点点,某中厂问到了一次,于是这一次就添加了进来。

通过上面的解释相信都大概了解的差不多了,其实就是hash函数映射,由于有hash冲突产生了误报率,误报率也就是判断失败的情况。

既然是由于hash冲突,那我把布隆过滤器的二进制向量调到很大,这样不就解决了嘛,但是由于数据量比较大,因此现在就要考虑一下误报率和存储效率之间选择一个折中值了。有一个计算公式如下:公式来源于github

假设位数组的长度为m,哈希函数的个数为k。检测某一元素是否在该集合中的误报率是:

啥事布隆过滤器?主要干嘛用的?啥事布隆过滤器?主要干嘛用的?

如何使得误报率最小,数学问题,求导就可以了。

4、使用场景

(1)google的guava包中有对Bloom Filter的实现

(2)通常使用布隆过滤器去解决redis中的缓存穿透,解决方案是redis中bitmap的实现,

(3)钓鱼网站、垃圾邮件检测

大体就这些,可能还有很多!!!

二、代码实现布隆过滤器

上面只是给出了其原理,下面我们代码实现一下。

public   class  MyBloomFilter {
   // 2 "www.愚公要移山.com" ;
       MyBloomFilter filter = new MyBloomFilter();
       //加入之前判断一下
       System.out.println(filter.contains(value));
       filter.add(value);
       //加入之后判断一下
       System.out.println(filter.contains(value));
   }
   //构造函数
    public  MyBloomFilter() {
        for  ( int  i  =   0 ; i  for  (SimpleHash f : func) {
           bits.set(f.hash(value),  true );
       }
   }
    //判断可疑网站是否存在
    public   boolean  contains(String value) {
        if  (value  ==   null ) {
            return   false ;
       }
        boolean  ret  =   true ;
        for  (SimpleHash f : func) {
           //核心就是通过“与”的操作
           ret  =  ret  &&  bits.get(f.hash(value));
       }
        return  ret;
   }
}

还有一个SimpleHash,我们看一下

public   static   class  SimpleHash {
       private  int  cap;
       private  int  seed;

       public  SimpleHash( int  cap,  int  seed) {
           this .cap  =  cap;
           this .seed  =  seed;
      }
       public   int  hash(String value) {
           int  result  =   0 ;
           int  len  =  value.length();
           for  ( int  i  =   0 ; i  return  (cap  -   1 )  &  result;
      }
  }

这就是布隆过滤器的实现。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/220654.html<

(0)
管理的头像管理
上一篇2025-04-14 16:22
下一篇 2025-04-14 16:23

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注