布隆(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 看 ...
随机推荐
- Sum of AP series——AP系列之和
A series with same common difference is known as arithmetic series. The first term of series is 'a' ...
- ES6 let和const命令(4)
const声明的常量只在当前代码块有效.如果想设置跨模块的常量,可以采用下面的写法. //constants.js模块 export const A = 1; export const B = 3; ...
- lesson - 1 aming
一. Linux是什么* 关于Linux历史(http://www.aminglinux.com/bbs/thread-6568-1-1.html 需要大家查查资了解,也可以看看5期的视频)* 发 ...
- java 学习(二)
public class Scoure { public static void main(String args[]) { int score=90; if (score>=85 && ...
- php 简单通用的日志记录方法
使用file_put_contents 方法来实现简单便捷的日志记录功能 方法1: // use \r\n for new line on windows, just \n on linux func ...
- composer安装laravel
安装composer composer是一个很有用的工具,我将用它在本机(win7)上安装laravel 到composer的官网,根据自己的系统要求下载相应的版本 安装laravel 首先cmd下进 ...
- Android动画(一)-视图动画与帧动画
项目中好久没用过动画了,所以关于动画的知识都忘光了.知识总是不用则忘.正好最近的版本要添加比较炫酷的动画效果,所以也借着这个机会,写博客来整理和总结关于动画的一些知识.也方便自己今后的查阅. Andr ...
- python的defaultdict
defaultdict是dict的一个子类,接受一个工厂函数作为参数,当访问defaultdict中不存在的key时,会将工厂函数的返回值作为默认的value. class defaultdict(d ...
- 微信跳一跳辅助自动跳Python
一.说明 此代码借鉴github一位大神所写,已经做了简化合并处理,如果能成功连上手机并运行,可以实现程序自动玩游戏,刷个1000+的分数轻轻松松 github源码地址 https://github. ...
- 初学Python之 布尔类型
与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and True # ==> True True and False # ==> False False an ...