布隆过滤的简单实现
public class BloomFilterTest {
public static void main(String[] args) {
BloomFilter bloomFilter = new BloomFilter();
bloomFilter.addElement("zhou");
bloomFilter.addElement("yu");
System.out.println(bloomFilter.containElement("zhou"));
System.out.println(bloomFilter.containElement("li"));
}
}
class BloomFilter {
// 容量
private static final int DEFAULT_SIZE = 1 << 20;
// 位数组
private BitSet sets = new BitSet(DEFAULT_SIZE);
/**
* 添加元素
*/
public void addElement(Object obj) {
sets.set(hash1(obj), true);
sets.set(hash2(obj), true);
}
/**
* 判断是否存在
* @param obj
* @return
*/
public boolean containElement(Object obj) {
return sets.get(hash1(obj)) && sets.get(hash2(obj));
}
/**
* 对hashcold进行扰动,然后根据容量取余
*/
private int hash1(Object obj) {
return hash(obj, 3);
}
/**
* 对hashcold进行扰动,然后根据容量取余
*/
private int hash2(Object obj) {
return hash(obj, 16);
}
private int hash(Object obj, int seed) {
int h;
return (obj == null) ? 0 : (DEFAULT_SIZE - 1) & ((h = obj.hashCode()) ^ (h >>> seed));
}
}