前言

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实现的更多相关文章

  1. Bloom过滤器

    提出一个问题 在我们细述Bloom过滤器之前,我们先抛出一个问题:给你一个巨大的数据集(百万级.亿级......),怎么判断一个元素是否在此数据集中?或者怎么判断一个元素不在此数据集中? 思考这个问题 ...

  2. java 文件过滤器 java.io.FilenameFilter

    File 类里有方法: String[] list(FilenameFilter filter)    返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录. File ...

  3. Hbase学习(三)过滤器 java API

    Hbase学习(三)过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根 ...

  4. Bloom 过滤器

    待续... package com.ghc.mmall.concurrency.nio; import com.google.common.hash.BloomFilter; import com.g ...

  5. SpringDataRedis事务处理

    public Long leftPush(V value) { return this.ops.leftPush(this.getKey(), value); } public Long leftPu ...

  6. Spring Data Redis 让 NoSQL 快如闪电(2)

    [编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...

  7. SpringDataRedis事务 专题

    5.10.1. @Transactional SupportTransaction Support is disabled by default and has to be explicitly en ...

  8. redis简单使用

    主要参考资料:http://wiki.jikexueyuan.com/project/redis-guide/data-type.html一.redis 安装1.在官网下载安装包2.解压安装包 tar ...

  9. 硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战

    在Redis 缓存击穿(失效).缓存穿透.缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」. 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看 ...

随机推荐

  1. nova创建虚拟机源码分析系列之一 restful api

    开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...

  2. CSS3 使用选择器在页面插入内容

    使用选择器来插入文字 h2:before{ content:'COLUMN'; color:white: background-color:orange: padding:1px 5px; } 注意点 ...

  3. 安装Linux桌面后无法显示登录桌面

    安装完图形后无法显示图形界面,只有命令行模式界面 . 猜测原因可能跟电脑位有关,在BIOS中开启虚拟化技术, 电脑开启设置F2 /Security/Virtualization, 选择Enable. ...

  4. asp.net core 2.0+sqlsugar搭建个人网站系列(0)

    一些废话 马上就要过年了,回顾这一年最大的收获就是技术有了很大的提升,其他的方面没有什么改变,现在还是单身小屌丝一枚. 这一年来学习的主要重点就是asp.net core,中间也使用 core+EF做 ...

  5. Java自己动手写连接池一

    自己动手写连接池,废话不多说,直接上代码,读取配置文件 package com.kama.cn; import java.io.IOException;import java.io.InputStre ...

  6. Linux 文本编辑器vi命令

    1.Vim Vim  是一个功能强大的全屏幕文本编辑器,是 Linux/UNIX 上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件. Vim 没有菜单,只有命令 2.Vim 工作模式 3.插入 ...

  7. 2、公司部门的组成 - CEO之公司管理经验谈

    今天讲讲公司部门的组成.公司部门一般是根据公司业务来进行划分的,IT企业和其它企业的部门划分有一定的区别.企业部门的划分还是比较重要的,部门主要明确各部门所具有的自己的职责.这里对IT企业的部门做了一 ...

  8. StringMVC POJO

    SpringMVC会按请求参数名和POJO类属性名进行自动匹配,自动为该属性填充属性值, 支持级联属性(本类包含其他类对象,如User类有一个属性为Address) 示例代码: index.jsp: ...

  9. js 数组API之every、some用法

    every 判断数组中是否每个元素都满足条件 只有都满足条件才返回true: 只要有一个不满足就返回false: arr.every(function(value,index,array){retur ...

  10. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密

    本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...