package com.xiaoleilu.hutool.bloomFilter.filter;
import com.xiaoleilu.hutool.bloomFilter.BloomFilter;
import com.xiaoleilu.hutool.bloomFilter.bitMap.BitMap;
import com.xiaoleilu.hutool.bloomFilter.bitMap.IntMap;
import com.xiaoleilu.hutool.bloomFilter.bitMap.LongMap;
/**
* 抽象Bloom过滤器
*
* @author loolly
*
*/
public abstract class AbstractFilter implements BloomFilter {
private BitMap bm = null;
protected long size = 0;
public AbstractFilter(long maxValue, int machineNum) {
init(maxValue, machineNum);
}
public AbstractFilter(long maxValue) {
this(maxValue, BitMap.MACHINE32);
}
public void init(long maxValue, int machineNum) {
this.size = maxValue;
switch (machineNum) {
case BitMap.MACHINE32:
bm = new IntMap((int) (size / machineNum));
break;
case BitMap.MACHINE64:
bm = new LongMap((int) (size / machineNum));
break;
default:
throw new RuntimeException("Error Machine number!");
}
}
@Override
public boolean contains(String str) {
return bm.contains(hash(str));
}
@Override
public boolean add(String str) {
final long hash = this.hash(str);
if (bm.contains(hash)) {
return false;
}
bm.add(hash);
return true;
}
/**
* 自定义Hash方法
* @param str 字符串
* @return HashCode
*/
public abstract long hash(String str) ;
}