布隆(Bloom)过滤器 JAVA实现
前言
Bloom过滤器,通过将字符串映射为信息指纹从而节省了空间。Bloom过滤器的原理为,将一个字符串通过一定算法映射为八个Hash值,将八个Hash值对应位置的Bitset位进行填充。在进行校验的时候,通过同样的算法计算八个Hash值,八个Hash值全部存在才可以认定为该字符串在集合中存在。
四个Hash值的布隆过滤器:
通过这样的一个算法,可以无需将字符串的MD5值存储在内存中,只需要定义一定长度的Bitset即可,从而大大节约了空间。
应用场景
Bloom过滤器可以广泛应用于判断集合中是否存在某个元素的大量数据场景,比如黑名单、爬虫访问记录。
实现
关于布隆过滤器的实现,代码如下:
import java.util.BitSet;
/*
简单的Bloom过滤器实现
*/
public class BloomDemo {
private static final int SIZE = 1<<24;
BitSet bitSet=new BitSet(SIZE);
Hash[] hashs=new Hash[8];
private static final int seeds[]=new int[]{3,5,7,9,11,13,17,19};
public static void main(String[] args) {
String email="zhenlingcn@126.com";
BloomDemo bloomDemo=new BloomDemo();
System.out.println(email+"是否在列表中: "+bloomDemo.contains(email));
bloomDemo.add(email);
System.out.println(email+"是否在列表中: "+bloomDemo.contains(email));
email="zhenlingcn@163.com";
System.out.println(email+"是否在列表中: "+bloomDemo.contains(email));
}
public BloomDemo(){
for (int i = 0; i < seeds.length; i++) {
hashs[i]=new Hash(seeds[i]);
}
}
public void add(String string){
for(Hash hash:hashs){
bitSet.set(hash.getHash(string),true);
}
}
public boolean contains(String string){
boolean have=true;
for(Hash hash:hashs){
have&=bitSet.get(hash.getHash(string));
}
return have;
}
class Hash{
private int seed = 0;
public Hash(int seed){
this.seed=seed;
}
public int getHash(String string){
int val=0;
int len=string.length();
for (int i = 0; i < len; i++) {
val=val*seed+string.charAt(i);
}
return val&(SIZE-1);
}
}
}
上面的Hash算法采用了最简单的基于seed和ascii码的Hash算法。八个种子均采用质数,减少HASH碰撞的概率。
布隆(Bloom)过滤器 JAVA实现的更多相关文章
- Bloom过滤器
提出一个问题 在我们细述Bloom过滤器之前,我们先抛出一个问题:给你一个巨大的数据集(百万级.亿级......),怎么判断一个元素是否在此数据集中?或者怎么判断一个元素不在此数据集中? 思考这个问题 ...
- java 文件过滤器 java.io.FilenameFilter
File 类里有方法: String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录. File ...
- Hbase学习(三)过滤器 java API
Hbase学习(三)过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根 ...
- Bloom 过滤器
待续... package com.ghc.mmall.concurrency.nio; import com.google.common.hash.BloomFilter; import com.g ...
- SpringDataRedis事务处理
public Long leftPush(V value) { return this.ops.leftPush(this.getKey(), value); } public Long leftPu ...
- Spring Data Redis 让 NoSQL 快如闪电(2)
[编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...
- SpringDataRedis事务 专题
5.10.1. @Transactional SupportTransaction Support is disabled by default and has to be explicitly en ...
- redis简单使用
主要参考资料:http://wiki.jikexueyuan.com/project/redis-guide/data-type.html一.redis 安装1.在官网下载安装包2.解压安装包 tar ...
- 硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
在Redis 缓存击穿(失效).缓存穿透.缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」. 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看 ...
随机推荐
- 树链剖分X2
1.ZJOI树的统计 板子题 因为初始化没打改了几个小时 改到双腿软着出的机房(身体素质感人 #include<iostream> #include<cstdio> #incl ...
- Python列表list对象方法总结
- 如何使用vuex
一.何为vuex? vuex其实是一种状态管理模式,那么什么是状态管理模式呢?简单的理解就是把一些状态或者数据集中到一个地方管理,然后所有的组件共享这些数据,当数据改变时,用到这些数据的组件也会相应的 ...
- gitlab 本地 定时备份
=============================================== 20171015_第1次修改 ccb_warlock === ...
- windows 下的python 安装pycrypto
一般在官方网站下载pycrypto: https://www.dlitz.net/software/pycrypto/ 然后使用命令就可以安装成功了: python setup.py build ...
- 【算法设计与分析基础】24、kruskal算法详解
首先我们获取这个图 根据这个图我们可以得到对应的二维矩阵图数据 根据kruskal算法的思想,首先提取所有的边,然后把所有的边进行排序 思路就是把这些边按照从小到大的顺序组装,至于如何组装 这里用到并 ...
- spring项目读取配置文件
Spring项目在运用中读取配置文件有两种方式: 通过项目的配置文件读取 在spring-context.xml里面加入以下代码 在运用到的类里面加入 @Value("#{configPro ...
- python 模块:csv
转自:http://www.cnblogs.com/sislcb/archive/2008/12/15/1355481.html (感谢整理) 举几个例子来介绍一下,Python 的 CSV模块的使用 ...
- python 打印几行空行、 打印不换行
2.x版本中使用print '\n' * n #n为行数 3.x版本中使用print('\n' * n) #n为行数 print 'Hello', :不会换行.[加上逗号(,)]
- CentOS配置SSH免密登录
假如我们有两台CentOS机器,192.168.199.101,192.168.199.102,要想在101上远程连接102可以通过ssh命令来实现 ssh 192.168.199.102 如果没有配 ...