Google Guava BloomFilter

当Guava项目发布版本11.0时,新添加的功能之一是BloomFilter类。 BloomFilter是唯一的数据结构,用于指示元素是否包含在集合中。 使BloomFilter有趣的是,它将指示元素是否绝对不包含或可能包含在集合中。

永远不会出现假阴性的特性使BloomFilter成为用作保护条件的绝佳候选者,以帮助防止执行不必要和昂贵的操作。 虽然BloomFilters最近获得了很好的曝光,但使用它意味着滚动自己的浏览器或通过Google搜索代码。 滚动自己的BloomFilter的麻烦在于获取正确的哈希函数来制作过滤器
有效。 考虑到Guava使用Murmur Hash来实现,我们现在有一个有效的BloomFilter有用,而只是一个图书馆而已。

BloomFilter速成课程

BloomFilters本质上是位向量。 在较高级别,BloomFilters以下列方式工作:

  1. 将元素添加到过滤器。
  2. 将其哈希几次,然后将索引与哈希结果匹配的位设置为1。

测试元素是否在集合中时,请遵循相同的哈希过程,并检查这些位是否设置为1或0。此过程是BloomFilter如何保证元素不存在的方法。 如果未设置位,则根本不可能将元素包含在集合中。 但是,肯定答案表示元素在集合中或发生哈希冲突。 可以在此处找到BloomFilter的更详细描述,并在此处找到有关BloomFilters的良好教程。 根据Wikipedia的说法,Google在BigTable中使用BloomFilters来避免对不存在的项目进行磁盘查找。 另一个有趣的用法是使用BloomFilter来优化sql Querry 。

使用番石榴BloomFilter

通过调用BloomFilter类上的static方法create来创建Guava BloomFilter,
传递一个Funnel对象和一个int表示预期的插入次数。 漏斗也是Guava 11中的新功能,它是一个可以将数据发送到Sink的对象。 下面的示例是默认实现,其误报百分比为3%。 Guava提供了一个Funnels类,其中包含两个静态方法,这些方法提供Funnel接口的实现,用于将CharSequence或字节数组插入到过滤器中。

//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(Funnels.byteArrayFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger.toByteArray());//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII.toByteArray());

更新:基于路易斯·沃瑟曼的评论,以下是如何使用自定义Funnel实现为BigIntegers创建BloomFilter的方法:

//Create the custom filter
class BigIntegerFunnel implements Funnel<BigInteger> {@Overridepublic void funnel(BigInteger from, Sink into) {into.putBytes(from.toByteArray());}}//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(new BigIntegerFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger);//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII);

注意事项

正确估计预期插入的数量至关重要。 当插入过滤器的次数接近或超过预期的数目时,BloomFilter开始填满,结果将产生更多的误报,直至无用之地。 还有另一个版本的BloomFilter.create方法,该方法带有一个附加参数,双精度表示所需的错误命中概率级别(必须大于0且小于1)。 错误命中概率的级别会影响用于存储或搜索元素的哈希数。 所需的百分比越低,执行的哈希数越高。

结论

BloomFilter是开发人员可以在其工具箱中使用的有用项。 现在,Guava项目使在需要时开始使用BloomFilter变得非常简单。 希望您喜欢这篇文章。 欢迎提出有用的意见和建议。

参考文献

  • Guava BloomFilter的单元测试演示 。
  • BloomFilter类
  • 您想了解的所有关于BloomFilters的信息 。
  • BloomFilter教程 。
  • Wikipedia上的BloomFilter 。

参考:来自我们的JCG合作伙伴 Bill Bejeck的Google Guava BloomFIlter,来自“ 随机思考编码”博客。

翻译自: https://www.javacodegeeks.com/2012/12/google-guava-bloomfilter.html

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

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

相关文章

php 编程祝新年快乐_用于测试自动化的7种编程语言

导读&#xff1a;本文重点介绍测试自动化中排名前七位的编程语言。当人们想要开始做自动化测试&#xff0c;此时却需要开发自动化测试脚本&#xff0c;也就是要学习一门编程语言。那么&#xff0c;我们怎样迈出这一步&#xff1f;也有你已经精通一种编程语言&#xff0c;也可以…

Day1 了解web前端

Day1 了解web前端 一.职业发展路线: 前端页面制作、前端开发、前端架构师 二.1)前端工程师主要职责: 利用HTML/CSS/JavaScript等各种Web技术进行客户端产品的开发。完成客户端程序&#xff08;也就是浏览器端&#xff09;的开发&#xff0c;同时结合后台技术模拟整体效果&am…

已阻止应用程序访问图形硬件_玩转智能硬件之Jetson Nano(三)深度学习环境搭建...

0、前言iotboy&#xff1a;玩转智能硬件&#xff08;一&#xff09;Jetson Nano安装篇​zhuanlan.zhihu.comiotboy&#xff1a;玩转智能硬件&#xff08;二&#xff09;Jetson Nano配置篇​zhuanlan.zhihu.com在玩转智能硬件&#xff08;一&#xff09;和&#xff08;二&#x…

Vue.js开发环境搭建的介绍

包含了最基础的Vue.js的框架&#xff0c;包含了打包工具和测试工具&#xff0c;开发调试的最基本的服务器&#xff0c;不需要关注细节&#xff0c;只需关注Vuejs对项目的实现 npm在国内的网络使用较慢&#xff0c;所以推荐下载安装淘宝的镜像 1&#xff1a; 2&#xff1a;安装c…

html文件转换html格式,pdf文件怎么转换成html格式

PDF文件怎么转换成html格式呢&#xff1f;html格式其实就是网页格式&#xff0c;PDF文件和网页文件一般情况下是两种完全不搭边的格式&#xff0c;但是不可否定的是办公室的多样化总有人会有这样的需求&#xff0c;只要有需求就会有其相应的解决方案。我们可以利用PDF转Word一样…

Eclipse中的Github Gists

我想描述有关在Eclipse中集成GitHub Gists的简单步骤。 有几个来源促使我这样做&#xff1a; Eclipse的GitHub Mylyn连接器 EGit / GitHub /用户指南 http://eclipse.github.com 我一直在使用Eclipse Java EE发行版&#xff0c;其中已经安装了Mylyn插件&#xff1a; 1.通…

CSS3景深-perspective

3D视图正方体&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>CSS3景深-perspective</title>6 </head>7 <style>8 #div1{9 position: rel…

python pool_派松水潭(Python Pool)

派松水潭(Python Pool)旅游景点类型&#xff1a;名胜Roebourne Winternoom Road , Roebourne , Western Australia , 6718Email:roetourbigpond.net.auWebsite:www.pilbaracoast.com派松水潭(Python Pool)坐落于罗伯恩(Roebourne)以南风景如画的米尔斯特姆-奇切斯特国家公园内。…

【BZOJ4262】Sum 单调栈+线段树

【BZOJ4262】Sum Description Input 第一行一个数 t&#xff0c;表示询问组数。第一行一个数 t&#xff0c;表示询问组数。接下来 t 行&#xff0c;每行四个数 l_1, r_1, l_2, r_2。Output 一共 t 行&#xff0c;每行一个数 Sum。Sample Input 4 1 3 5 7 2 4 6 8 1 1 9 9 9 9 1…

父类一实现serializable_我的java基础学习易错点和易忘点总结(一)

一.继承A:子类只能继承父类所有非私有的成员(成员方法和成员变量)B:子类不能继承父类的构造方法&#xff0c;但是可以通过super关键字去访问父类构造方法。二.继承中构造方法的关系A:子类中所有的构造方法默认都会访问父类中空参数的构造方法B:为什么呢?因为子类会继承父类中的…

Avocado 安装和简单测试

1.Avocado 安装 1.1 通过包安装 像Fedora可以通过rpm包进行安装&#xff0c;其他通过RPM管理的发行版需要自己制作相关包。Avocado同样支持DEP包的安装可以在contrib/packages/debian找到。 Fedora 首先通过下面的命令获取仓库配置文件。 sudo curl https://repos-avocadoproje…

html文档主体的根标签,2 HTML简介标签嵌套和并列关系文档声明

HTML&#xff1a;Hyper Text Markup Language 超文本标签语言(hyper&#xff1a;精力旺盛的 markup:标记 n noun)HTML不是编程语言&#xff0c;而是一种标记语言(就是一套标记标签)&#xff0c;用于描述网页&#xff0c;是网页制作必备的。超文本是指页面内可以包含图片、链接…

深入克隆

在继续克隆概念之前&#xff0c;让我们用对象创建概念刷新基础知识。 使用new运算符创建对象时&#xff0c;对象将在堆中获取内存分配。 堆中的对象创建 在Java中&#xff0c;理想情况下仅通过引用变量修改对象&#xff0c;即仅复制对象的内存地址&#xff0c;因此原始对象中…

c# 口口乱码_c# 乱码解决方法

1 设置web.configrequestEncoding"utf-8"responseEncoding"utf-8"fileEncoding"utf-8"/>如果相应使用gb2312 &#xff0c;则html页面也要设置相同&#xff0c;解决乱码。如果为 utf-8 &#xff0c;则相应的html文件的属性要转换成utf-8保存&a…

《你的灯亮着吗?》个人总结

我要如何去解决问题 搞清楚问题是什么 问题就是我们的体验和期待的所产生的差异 * 问题的本质 * 问题的定义 * 问题的产生 * 问题的表述谁需要解决问题要多维的看待问题问题来自哪里问题的解决方法在特定的层面上去解决问题问题的解决是要交给能解决问题的人--谁能解决问题别轻…

html文档的文件头的主要作用是什么,文件头

本词条缺少概述图&#xff0c;补充相关内容使词条更完整&#xff0c;还能快速升级&#xff0c;赶紧来编辑吧&#xff01;文件头是位于文件开头的一段承担一定任务的数据&#xff0c;一般都在开头的部分。中文名文件头位 置位于文件开头任 务承担一定任务的数据类 别文…

索引和未索引执行计划的比较_详解Oracle复合索引+实例说明

复合索引复合索引顾名思义&#xff0c;区别于单列索引&#xff0c;是由两个或多个列一起构成的索引。其在B树上的数据结构是什么样&#xff1f;如下图&#xff0c;是一个包含两列的复合索引。如果你观察仔细&#xff0c;还会发现它的叶子节点是ASC递增排序的。现根据第一个值排…

Datables使用总结

本文共四部分&#xff1a;官网 | 基本使用|遇到的问题|属性表 一&#xff1a;官方网站&#xff1a;[http://www.datatables.net/] 二&#xff1a;基本使用&#xff1a;[http://www.guoxk.com/node/jquery-datatables] 1、DataTables的默认配置 $(document).ready(function() { …

python面向窗体的开发_Python高级进阶#019 pyqt5菜单menu应用,新建多窗体

知识回顾&#xff1a;1.掌握的是QCalendarWidget日历控件2.click点击事件(信号)触发3.掌握日期的格式化QDate本节知识视频教程以下开始文字讲解&#xff1a;一、案例&#xff1a;菜单1.新建第一个窗体2.一级菜单的配置3.二级菜单的配置4.利用菜单功能实现界面跳转&#xff0c;实…

用方面清理代码

在我以前的文章中&#xff0c;我描述了字母转换&#xff0c;并且提到了我们使用AspectJ解决了该任务&#xff0c;但是我没有提及AspectJ的工作原理以及一般性的方面。 因此&#xff0c;在接下来的几行中&#xff0c;我将解释&#xff1a; 什么是面向方面的编程&#xff0c;为什…