bloomfilter的java实现,BloomFilter(布隆过滤器)原理及实战详解

什么是 BloomFilter(布隆过滤器)

布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景,这个时候往往我们都是采用 Hashmap,Set 或者其他集合将数据保存起来,然后进行对比判断,但是如果元素很多的情况,我们如果采用这种方式就会非常浪费空间。这个时候我们就需要 BloomFilter 来帮助我们了。

BloomFilter 原理

BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列(通常好几个)映射函数组成的。布隆过滤器的原理是,当一个变量被加入集合时,通过 K 个映射函数将这个变量映射成位图中的 K 个点,把它们置为 1。查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合中有没有它了,如果这些点有任何一个 0,则被查询变量一定不在;如果都是 1,则被查询变量很可能在。注意,这里是可能存在,不一定一定存在!这就是布隆过滤器的基本思想。

如下图所示,字符串 “ziyou” 在经过四个映射函数操作后在位图上有四个点被设置成了 1。当我们需要判断 “ziyou” 字符串是否存在的时候只要在一次对字符串进行映射函数的操作,得到四个 1 就说明 “ziyou” 是可能存在的。

4f8aee220e3d4a1d6882ee0d1667b954.png

为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散列函数是会有碰撞的,意思也就是说会存在一个字符串可能是 “ziyou01” 经过相同的四个映射函数运算得到的四个点跟 “ziyou” 是一样的,这种情况下我们就说出现了误算。另外还有可能这四个点位上的 1 是四个不同的变量经过运算后得到的,这也不能证明字符串 “ziyou” 是一定存在的,如下图框出来的 1 也可能是字符串“张三”计算得到,同理其他几个位置的 1 也可以是其他字符串计算得到。

84a7883935ca28750665b9e06a58a36a.png

1.2 特性

所以通过上面的例子我们就可以明确

一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在。

布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

02、使用场景

2.1、网页 URL 去重

我们在使用网页爬虫的时候(爬虫需谨慎),往往需要记录哪些 URL 是已经爬取过的,哪些还是没有爬取过,这个时候我们就可以采用 BloomFilter 来对已经爬取过的 URL 进行存储,这样在进行下一次爬取的时候就可以判断出这个 URL 是否爬取过。

2.2、黑白名单存储

工作中经常会有一个特性针对不同的设备或者用户有不同的处理方式,这个时候可能会有白名单或者黑名单存在,所以根据 BloomFilter 过滤器的特性,我们也可以用它来存在这些数据,虽然有一定的误算率,但是在一定程度上还是可以很好的解决这个问题的。

2.3、小结

除了上面说的两种场景,其实还有很多场景,比如热点数据访问,垃圾邮件过滤等等,其实这些场景的统一特性就是要判断某个元素是否在某个集合中,原理都是一样的。

03、代码实践

3.1、自己实现

package com.test.pkg;

import java.util.BitSet;

/**

*

* Function:

* Author:@author ziyou

* Date:2019-10-23 23:21

* Desc:

*/

public class BloomFilterTest {

/**

* 初始化布隆过滤器的 bitmap 大小

*/

private static final int DEFAULT_SIZE = 2 << 24;

/**

* 为了降低错误率,这里选取一些数字作为基准数

*/

private static final int[] seeds = {3, 5, 7, 11, 13, 31, 37, 61};

/**

* 设置 bitmap

*/

private static BitSet bitset = new BitSet(DEFAULT_SIZE);

/**

* 设置 hash 函数数量

*/

private static HashFunction[] functions = new HashFunction[seeds.length];

/**

* 添加数据

*

* @param value 需求加入的值

*/

public static void put(String value) {

if (value != null) {

for (HashFunction f : functions) {

//计算 hash 值并修改 bitmap 中相应位置为 true

bitset.set(f.hash(value), true);

}

}

}

/**

* 判断相应元素是否存在

*

* @param value 需要判断的元素

* @return 结果

*/

public static boolean check(String value) {

if (value == null) {

return false;

}

boolean ret = true;

for (HashFunction f : functions) {

ret = bitset.get(f.hash(value));

//一个 hash 函数返回 false 则跳出循环

if (!ret) {

break;

}

}

return ret;

}

public static void main(String[] args) {

String value = "test";

for (int i = 0; i < seeds.length; i++) {

functions[i] = new HashFunction(DEFAULT_SIZE, seeds[i]);

}

put(value);

System.out.println(check("value"));

}

}

class HashFunction {

private int size;

private int seed;

public HashFunction(int size, int seed) {

this.size = size;

this.seed = seed;

}

public int hash(String value) {

int result = 0;

int len = value.length();

for (int i = 0; i < len; i++) {

result = seed * result + value.charAt(i);

}

int r = (size - 1) & result;

return (size - 1) & result;

}

}

上面我们自己写了一个简单的 BloomFilter ,通过 put 方法录入数据,通过 check 方法判断元素是否存在,基本能实现功能,代码中注释也写的很清楚,但是自己实现必定效率不高,所以下面我们看下业内大佬帮我们已经实现好的 BloomFilter。

2.4、Guava 中的 BloomFilter

package com.test.pkg;

import com.google.common.hash.BloomFilter;

import com.google.common.hash.Funnels;

/**

*

* Function:

* Author:@author ziyou

* Date:2019-10-24 00:17

* Desc:

*/

public class BloomFilterTest02 {

public static void main(String[] args) {

BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100000, 0.01);

for (int i = 0; i < 100000; i++) {

bloomFilter.put(i);

}

System.out.println(bloomFilter.mightContain(1));

System.out.println(bloomFilter.mightContain(2));

System.out.println(bloomFilter.mightContain(3));

System.out.println(bloomFilter.mightContain(100001));

}

}

Guava 中已经帮我们实现好了 BloomFilter 的代码,我们只需要在使用的地方调用就好。

这里我们简单解释一下构造方法中的后面两个参数,一个是预计包含的数据量,一个是允许的误差值。代码中会根据我们填入的这两个值,自动帮我们计算出数组的大小,以及需要的散列函数个数,如下图。更多详细的内容,读者可以自行去查看源码,我们这里就不介绍了。

610c07a81fe6ba44a8f10ffbe4c9a748.png

1ca0bc7362b7bb9c44ba0d1f401d60e7.png

04、总结

这篇文章给大家介绍了 BloomFilter,一个用来判断元素是否存在与某个集合的高效方法,可以在我们日常的工作中运用起来,结合日常工作的场景,可以进行选择。

原文发于:《Java极客技术》公众号,作者:ziyou

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 西南科技大学 计算机工业控制 在线考试复习资料

计算机工业控制——在线考试复习资料 一、单选题 1.某位移测量系统中,位移测量仪表的量程为0-100mm,采用8位 A/D转换器转换后输出为00H~FAH,若位移值为30H,此时A/D转换器输出的数字量为( )。 A.60H B.64H C.6AH D.6FH 2.某位移测量系统中,位移测量仪表的量程为0-100mm,采用8位…

六种让路由器与交换机更加安全的方法

传统的网络安全技术侧重于系统入侵检测&#xff0c;反病毒软件或防火墙。内部安全如何&#xff1f;在网络安全构造中&#xff0c;交换机和路由器是非常重要的&#xff0c;在七层网络中每一层都必须是安全的。很多交换机和路由器都有丰富的安全功能&#xff0c;要了解有些什么&a…

[渝粤教育] 西南科技大学 车辆构造 在线考试复习资料

车辆构造——在线考试复习资料 一、单选题 1.常用的敞车有( )通用敞车。 A.62系列、C64系列和C70系列 B.62系列、C65系列和C70系列 C.62系列、C64系列和C80系列 D.61系列、C62系列和C70系列 2.下列缓冲器的容量最大的是( )。 A.MX—1型 B.G2型 C.MX—2型 D.MT—2型 3.MX-1型、…

【渝粤教育】电大中专学前儿童发展心理学3作业 题库

作业视频教务托管&#xff0c;壹叁路路贰陆陆壹〇肆〇 学前儿童心理学是( )的分支。 A.儿童发展心理学 B.发展心理学 C.儿童教育心理学 D.儿童心理学 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.儿童心理发展不具备( )特点。 A.条件性和多元性 B.普遍性和差异…

【渝粤教育】电大中专幼儿园课程论_1作业 题库

1下列哪种不是具有代表性的课程定义() A课程即科目 B课程即经验 C课程即目标 D课程即知识 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2一元化课程是一种()课程 A主流中心的 B辅助指导的 C综合的 D儿童中心的 正确 正确答案&#xff1a;左边查询 学生答案&#…

spring jaxb_自定义Spring命名空间使JAXB变得更容易

spring jaxb首先&#xff0c;让我大声说一下&#xff1a; Spring不再是XML繁重的了 。 实际上&#xff0c;如今&#xff0c;您可以使用大量注释&#xff0c; Java配置和Spring Boot来编写几乎没有XML或根本没有XML的Spring应用程序。 认真地停止谈论Spring和XML&#xff0c;这已…

【渝粤教育】电大中专新媒体营销实务 (6)作业 题库

1.在不同的时间段&#xff0c;新媒体有着不同的内涵。这是指新媒体的&#xff08; &#xff09;。 A.相对概念 B.发展概念 C.时间概念 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.互联网媒体是指第四媒体&#xff0c;即移动网络的无线增值服务。该说法&#x…

什么是8口poe交换机?8口poe交换机有哪些特点?

八口POE交换机&#xff08;POE31008P&#xff09;提供了从一个网络节点利用5类以太网线的电源和数据的传输。81端口快速以太网端口能用于10/100Mps的连接&#xff0c;其中8个端口可以提供工业标准的IEEE802.3af电源。先进的自感知算法只为标准PD终端设备供电&#xff0c;因而不…

【渝粤教育】电大中专电商运营实操 (19)作业 题库

1.目前菜鸟网络依赖大数据和云计算已实现了哪些功能&#xff08; &#xff09; A.智能分单 B.智能发货 C.自动化仓库 D.物流云加速 E.以上都正确 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.电子商务未来发展的三大关键因素是支付、物流和商品。 &#xff08;…

oracle查看表的命令,Oracle常用查看表结构命令

获取表&#xff1a; select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select table_name from dba_tables; //包括系统表 select table_name from dba_tables where owner用户名 user_tables&#xff1a; table_name,t…

如何为您的AWS账户设置多因素身份验证(MFA)

步骤1 &#xff1a; 转到AWS控制台并使用您的用户名密码登录。 第2步 &#xff1a; 转到服务-> IAM 第三步&#xff1a; 单击您的根帐户上的激活MFA 第四步 &#xff1a; 在步骤3中&#xff0c;点击屏幕上的管理MFA按钮。 步骤5&#xff1a; 单击分配MFA设备。选…

【渝粤教育】电大中专电子商务网站建设与维护 (27)作业 题库

1阿里巴巴是于1999年创立的&#xff08; &#xff09;的网上贸易市场平台。 A企业对企业 B企业对消费者 C企业对零售商 D零售商对消费者 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2目前&#xff0c;阿里巴巴集团旗下主要交易市场不包括哪个&#xff08; &…

电视光端机常见故障问题介绍

一提到电视光端机&#xff0c;可能就会让人想起传输距离远、保密性强、抗干扰能力强、传输性能好、容量大等优点&#xff0c;当然也不会忘记价格高这个特点。但是&#xff0c;我们在使用电视光端机的过程中难免会出现各种各样的故障问题&#xff0c;接下来就由飞畅科技的小编来…

【渝粤教育】电大中专药剂学基础知识_1作业 题库

1.胶囊剂不检查的项目是&#xff08;&#xff09;。 A.装量差异 B.崩解时限 C.硬度 D.水分 E.外观 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.成裂片和顶裂的原因正确的是&#xff08;&#xff09;。 A.压力分布的不均匀 B.颗粒中细粉太多 C.颗粒过干 D.弹性…

电视光端机应用范围及故障维护问题介绍

随着国内通信网络的发展&#xff0c;发展势头强劲&#xff0c;电视光端机应用的监控范围也越来越广。目前&#xff0c;电视光端机应用最多的方面就是长距离视频和数据的传输。在高速公路、银行、电力、电信等的监控领域都要求对视频信号进行远程的传输&#xff0c;目前主要的解…

【渝粤教育】电大中专新媒体营销实务 (16)作业 题库

1&#xff08;&#xff09;对新媒体的定义为&#xff1a;“以数字信息技术为基础&#xff0c;以互动传播为特点&#xff0c;具有创新形态的媒体。” A华纳兄弟总裁施瓦茨威格 B联合国教科文组织 C新传媒产业联盟秘书长王斌 错误 正确答案&#xff1a;左边查询 学生答案&#xf…

php项目部署lnmp,如何在lnmp环境里,部署多个php项目?

我有2个php项目&#xff0c;想放在同一个lnmp环境里如果你说两个项目是通过两个不同的域名来访问的话&#xff0c;直接参考以下conf文件内容第一段&#xff1a;server {listen 80 ;server_name www.host1.cc; #监听的hostnameroot /var/www/www_host1_cc/; #第一个项目…

linux文件系统的管理方法,Linux学习笔记:2.文件系统的管理命令(2)

1.命令touch&#xff1a;功能&#xff1a;若之前对应文件不存在&#xff0c;创建一个新文件&#xff1b;若存在&#xff0c;则修改这个文件的最后修改期限。语法&#xff1a;touch [参数] [文件名]主要参数&#xff1a;-a&#xff1a;只更改存取时间-c&#xff1a;不建立任何文…

光端机2m是什么意思,光端机E1与2M有什么关系?

光端机就是将多个E1信号变成光信号的设备&#xff0c;光端机也叫光传输设备。光端机根据传输E1&#xff08;就是2M&#xff09;口数量的多少&#xff0c;价格也不同。一般最小的光端机可以传输4个E1目前最大的光端机可以传输4032个E1每个E1包括30个电话。那么&#xff0c;光端机…

【渝粤教育】电大中专职业健康与安全_1作业 题库

1根据系统安全工程的观点&#xff0c;危险是指系统中存在导致发生不期望后果的可能性超过了&#xff08; &#xff09; A极限 B人们的承受程度 C危险度 D安全系数 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2对职工来说&#xff0c;安全是&#xff08;&#x…