BloomFilter布隆过滤器使用
从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过权衡得到一个错误概率可以接受的结果。
算法比较复杂,也不是我们研究的范畴,我们直接使用已有的实现。
google的guava包中提供了BloomFilter类,我们直接使用它来进行一下简单的测试。
新建一个maven工程,引入guava包
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
</dependencies>
测试分两步:
一 我们往过滤器里放一百万个数,然后去验证这一百万个数是否能通过过滤器,目的是校验是坏人是否一定被抓。
二 我们另找1万个不在这一百万范围内的数,去验证漏网之鱼的概率,也就是布隆过滤器的误伤情况。
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.ArrayList;
import java.util.List;
/**
* Created by admin on 17/7/7.
* 布隆过滤器
*/
public class Test {
private static int size = 1000000;
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size);
public static void main(String[] args) {
for (int i = 0; i < size; i++) {
bloomFilter.put(i);
}
for (int i = 0; i < size; i++) {
if (!bloomFilter.mightContain(i)) {
System.out.println("有坏人逃脱了");
}
}
List<Integer> list = new ArrayList<Integer>(1000);
for (int i = size + 10000; i < size + 20000; i++) {
if (bloomFilter.mightContain(i)) {
list.add(i);
}
}
System.out.println("有误伤的数量:" + list.size());
}
}
运行后发现,没有坏人逃脱,当我们去遍历这一百万个数时,他们都在过滤器内被识别了出来。
误伤的数量是330.也就是有330个不在过滤器内的值,被认为在过滤器里,被误伤了。
错误概率是3%作用,为毛是3%呢。我们跟踪源码看一下就知道了。
在create的多个重载方法中,最终走的是有4个参数的那个。我们上面用的是有2个参数的,注意看图片最下面,我们不填第三方参数时,默认补了一个0.03,这个就代表了允许的错误概率是3%。第四个参数是哈希算法,默认是BloomFilterStrategies.MURMUR128_MITZ_64,这个我们不去管它,反正也不懂。
在第127行可以看到,要存下这一百万个数,位数组的大小是7298440,700多万位,实际上要完整存下100万个数,一个int是4字节32位,我们需要4X8X1000000=3千2百万位,差不多只用了1/5的容量,如果是HashMap,按HashMap 50%的存储效率,我们需要6千4百万位,所有布隆过滤器占用空间很小,只有HashMap的1/10-1/5作用。
128行是hash函数的数量,是5,也就是说系统觉得要保证3%的错误率,需要5个函数外加700多万位即可。用3%误差换十分之一的内存占用。
我们也可以修改这个错误概率,譬如我们改为0.0001万分之一。
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.0001);
再次运行看看
我们将28行改为10万个数,发现结果为“误伤12”。可以看到这个概率是比较靠谱的。
当概率为万分之一时,我们看看空间占用。
此时bit容量已经从700多万到1900万了,函数数量也从5变成了13.概率从3%缩减到万分之一。
这就是布隆过滤器的简单使用。具体的应用场景,具体实现。
BloomFilter布隆过滤器使用的更多相关文章
- 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中
第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...
- 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中
Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...
- 将bloomfilter(布隆过滤器)集成到scrapy-redis中
Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...
- BloomFilter(布隆过滤器)
原文链接:http://blog.csdn.net/qq_38646470/article/details/79431659 1.概念: 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保 ...
- BloomFilter布隆过滤器
BloomFilter 简介 当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1.检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些 ...
- 使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重
Bloom Filter是一个占用空间很小.效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成.可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1). 在很多场景下 ...
- 白话布隆过滤器BloomFilter
通过本文将了解到以下内容: 查找问题的一般思路 布隆过滤器的基本原理 布隆过滤器的典型应用 布隆过滤器的工程实现 场景说明: 本文阐述的场景均为普通单机服务器.并非分布式大数据平台,因为在大数据平台下 ...
- 布隆过滤器(BloomFilter)持久化
摘要 Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式程序的统一去重.我们可以将数据进行持久化,这样就克服了down机的问题,常见的持久化方法包 ...
- HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍
布隆过滤器( Bloom filters) 数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块.但是它的效用是有限的.HFile数据块的默认大小是64KB,这个大 ...
随机推荐
- (转载)Hibernate与Jpa的关系
我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实 ...
- PAT 天梯赛 L1-035. 情人节 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-035 AC代码 #include <iostream> #include <cstdio&g ...
- jQuery可自动播放动画的焦点图
在线演示 本地下载
- 部署 LAMP (CentOS 7.2),摘自阿里云,方便查看使用
原文地址:https://help.aliyun.com/document_detail/50774.html?spm=5176.product25365.6.728.C9s3V8 简介 LAMP指L ...
- QML、Qt Quick
当用widget开发Qt时, 语言:C++ 库:Qt库 当用QML开发时, 语言:QML 库:Qt Quick
- quartz(6)--集群
Quartz应用能被集群,是水平集群还是垂直集群取决于你自己的需要.集群提供以下好处: · 伸缩性 · 高可用性 · 负载均衡 目前,Quartz只能借助关系数据库和JDBC作业存储支持集群. qua ...
- 利用正则提取discuz的正文内容
源正文: [p=24, null, left][color=#000][font=宋体]近日,香港著名漫画家马荣成在香港举办的"[color=#ff660][url=http://cul.c ...
- HTML常用标签——思维导图
如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/38d99149304484
- 浅谈 django Models中的跨表
跨表操作在数据库操作非常常用,虽然其会降低读取数据的性能,但是它能节约数据在硬盘中的占用,优化数据表的结构和各自之间的关系. 在sql中,一般跨表需要用到 join 关键字 select * from ...
- imageView图片放大缩小及旋转
imageView图片放大缩小及旋转 一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCen ...