package com.xiaoleilu.hutool.bloomFilter;
import com.xiaoleilu.hutool.bloomFilter.filter.DefaultFilter;
import com.xiaoleilu.hutool.bloomFilter.filter.ELFFilter;
import com.xiaoleilu.hutool.bloomFilter.filter.JSFilter;
import com.xiaoleilu.hutool.bloomFilter.filter.PJWFilter;
import com.xiaoleilu.hutool.bloomFilter.filter.SDBMFilter;
/**
* BlommFilter 实现 <br>
* 1.构建hash算法 <br>
* 2.散列hash映射到数组的bit位置 <br>
* 3.验证<br>
* 此实现方式可以指定Hash算法
*
* @author Ansj
*/
public class BitMapBloomFilter implements BloomFilter{
private BloomFilter[] filters;
/**
* 使用默认的5个过滤器
* @param m M值决定BitMap的大小
*/
public BitMapBloomFilter(int m) {
float mNum = m / 5;
long size = (long) (1L * mNum * 1024 * 1024 * 8);
filters = new BloomFilter[]{
new DefaultFilter(size),
new ELFFilter(size),
new JSFilter(size),
new PJWFilter(size),
new SDBMFilter(size)
};
}
/**
* 使用自定的多个过滤器建立BloomFilter
*
* @param m M值决定BitMap的大小
* @param filters Bloom过滤器列表
*/
public BitMapBloomFilter(int m, BloomFilter... filters) {
this.filters = filters;
}
/**
* 增加字符串到Filter映射中
* @param str 字符串
*/
@Override
public boolean add(String str) {
boolean flag = true;
for (BloomFilter filter : filters) {
flag |= filter.add(str);
}
return flag;
}
/**
* 是否可能包含此字符串,此处存在误判
* @param str 字符串
* @return 是否存在
*/
@Override
public boolean contains(String str) {
for (BloomFilter filter : filters) {
if (filter.contains(str) == false) {
return false;
}
}
return true;
}
}