谷歌guava

当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查询 。

使用番石榴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

谷歌guava

谷歌guava_Google Guava BloomFilter相关推荐

  1. 谷歌guava_Google Guava:您永远不会知道的5件事

    谷歌guava 每个开发人员可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在 ...

  2. 谷歌guava_Google Guava BiMaps

    谷歌guava 接下来的番石榴之旅是另一个有用的收藏类型BiMap . 实际上,这非常简单,BiMap只是双向地图. 反转地图 普通的Java映射是一组键和值,您可以按键查找值,这非常有用,例如,说我 ...

  3. 谷歌guava_Google Guava –期货

    谷歌guava 这篇文章是我在Google Guava上的系列文章的延续,这次涵盖了Future. Futures类是用于使用Future / ListenableFuture接口的静态实用程序方法的 ...

  4. 谷歌guava_Google Guava MultiMaps

    谷歌guava 番石榴 这是我尝试解释和探索Google很棒的Guava java库的系列文章中的第一篇. 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Gua ...

  5. 谷歌guava_Google Guava v07范例

    谷歌guava 我们在TouK举办了一个名为"每周技术研讨会"的活动,即每个星期五的16:00,每个愿意参加的人都有一个演讲. 我们展示了我们在家学习和学习的东西,但是我们还设有一 ...

  6. Google Guava BloomFilter

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

  7. Springboot项目中通过谷歌的guava实现令牌桶算法,来进行请求限流

    令牌桶算法是一种对请求限流的有效算法,核心思想是,一定时间内产生固定数量的令牌,拿到该令牌的请求可以通过,进行业务处理,没有拿到令牌的请求需要等待,直到新的令牌产生并领到该令牌,才可以通过,否则一直被 ...

  8. 谷歌Guava LoadingCache介绍

      在工作中,加Cache是非常常见的一种性能优化手段,操作系统底层.计算机硬件层为了性能优化加了各种各样的Cache,当然大多数都是对应用层透明的.但如果你想在应用层加Cache的话,可能就需要你自 ...

  9. 浅析 BloomFilter

    本文前四个章节是我转载的,作者写的浅显易懂,非常不错的文章.原文地址:http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html Bloo ...

最新文章

  1. webpack4.0各个击破(2)—— CSS篇
  2. 关于Spring事务tx:annotation-driven/的理解(Controller可以使用@Transactional)
  3. QT4 自定义槽和信号
  4. VS2010+matlab2012b环境下C++写MAT文件
  5. 牛客题霸 [扑克牌顺子] C++题解/答案
  6. Windbg简明教程(转)
  7. Java-JUC(六):创建线程的4种方式
  8. .netFramework 升级NetCore 问题汇总及解决方案
  9. PHP学习笔记--函数
  10. 利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型...
  11. securecrt 终端VIM配色
  12. 【毕业设计】单片机智能鱼缸系统 - 嵌入式 物联网 stm32
  13. Origin画图技巧之回归(标准值与预测值)
  14. 在 win7 上简单搭建ftp服务器
  15. 程序人生-哈工大计算机系统大作业2022春
  16. js array 添加对象_不可不知的 Vue.js 列表渲染
  17. Shell脚本循环语句及exit、continue和break用法
  18. 程序部署 程序包不放在tomcat里面
  19. ios自制电话本-swift
  20. Microsoft word 中的题注修改后更新的问题

热门文章

  1. 认识JVM--第一篇-对象分配&回收算法
  2. Oracle入门(十四.9)之迭代控制:WHILE和FOR循环
  3. Oracle入门(二)之服务启动bat
  4. 什么时候才能都及格呢?
  5. mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
  6. React中的模糊匹配与精准匹配
  7. 两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc
  8. php 接收文件 错误代码3,php上传文件错误代码3
  9. asp 执行 exe_EXE程序加密锁下载-EXE程序加密锁电脑版下载v5.0
  10. redis集群依赖ruby