前言:
java入行很多年了,今天开始分享技术,摸摸渐疏的刘海,划船不靠浆,全靠一个浪,对就是我信小白,大家共勉!
原理:
通俗易懂语言来描述一下(可能有误解):
- BloomFilter 就是一个大的HashSet, 里面存的值都是0;
- 存入一个值,通过hash解析,并映射在hashset 不同的位置,并把这些位置的0修改为1
- 检验另一个值,通过hash解析,判断hashset这些位置上是否都为1,都为1则存在;
bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。
算法:
- 首先需要k个hash函数,每个函数可以把key散列成为1个整数
- 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
- 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
- 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
一、手写java布隆过滤器
问题:布隆过滤器会不会满,会有很多人忽略了这一点
废话不多少直接上代码
/**
* 布隆过滤器
*
* @author 信小白
* @date created 2020/7/27 18:11
* @since 1.0
*/
public class BloomFilterUtil implements Serializable {
// 数组
private final int[] seeds;
// 大小
private final int size;
// set的计划
private final BitSet notebook;
private final MisjudgmentRate rate;
private final AtomicInteger useCount = new AtomicInteger();
private final Double autoClearRate;
/**
* 默认中等程序的误判率:MisjudgmentRate.MIDDLE 以及不自动清空数据(性能会有少许提升)
*
* @param dataCount 预期处理的数据规模,如预期用于处理1百万数据的查重,这里则填写1000000
*/
public BloomFilterUtil(int dataCount) {
this(MisjudgmentRate.MIDDLE, dataCount, null);
}
/**
* @param rate 一个枚举类型的误判率
* @param dataCount 预期处理的数据规模,如预期用于处理1百