class BloomFilterDemo {
//设置的位集大小
private int defaultSize = 16 << 24;
//最大索引位置
private int maxIndex = defaultSize - 1;
//建立一个二进制位集
private BitSet bits = new BitSet(defaultSize);
/**
* 添加元素的方法
*
* @param key
*/
public void add(String key) {
int bloomCode[] = getCode(key);
for (int i = 0; i < 8; i++) {
bits.set(bloomCode[i]); // 这里影响添加的元素大小
}
}
/**
* 随机数生成器
*
* @param key
* @return
*/
private int[] getCode(String key) {
int[] randomArr = new int[8];
for (int i = 0; i < 8; i++) {
randomArr[i] = hash(key, i);
}
return randomArr;
}
/**
* 自己定义的hash算法(一定要用&运算)
*
* @param key 输入的key值
* @param n 自定义的参数,用来传入不同参数生成不同的随机数
* @return
*/
private int hash(String key, int n) {
int result = key.hashCode() * n;
return result & maxIndex;
}
/**
* 判断一个元素是否在表中
*
* @param key
* @return
*/
public boolean exits(String key) {
int keyCode[] = getCode(key);
if (bits.get(keyCode[0]) && bits.get(keyCode[1])
&& bits.get(keyCode[2]) && bits.get(keyCode[3])
&& bits.get(keyCode[4]) && bits.get(keyCode[5])
&& bits.get(keyCode[6]) && bits.get(keyCode[7])) {
return true;
}
return false;
}
}
public class BloomFilter {
public static void main(String[] args) {
BloomFilterDemo bf = new BloomFilterDemo();
Long aBeginTime = System.currentTimeMillis();// 记录BeginTime
for (int i = 0; i < 100000; i++) {
bf.add("Java" + i);
}
Long aEndTime = System.currentTimeMillis();// 记录EndTime
System.out.println("Insert Time-->" + (aEndTime - aBeginTime));
Long lBeginTime = System.currentTimeMillis();// 记录BeginTime
System.out.println(bf.exits("Java" + 99139));
Long lEndTime = System.currentTimeMillis();// 记录EndTime
System.out.println("Search Time--->" + (lEndTime - lBeginTime));
}
}
手撕布隆过滤器
最新推荐文章于 2023-07-09 14:06:34 发布