1.java代码实现布隆过滤器
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Objects;
/**
* Created with IntelliJ IDEA.
* Description:
* User: tongyongtao
* Date: 2020-11-02
* Time: 20:37
* java代码实现 Bloomfilter
* 参考
*/
public class Bloomfilter {
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(11111);
System.out.println(integers.hashCode()>>>16 );
MyBloomFilter filter = new MyBloomFilter();
int value1 = 11111;
int value2 = 11111;
filter.add(value1);
filter.add(value2);
System.out.println(filter.contains(value1));
System.out.println(filter.contains(value2));
}
}
class MyBloomFilter {
//bitset数组的大小
private static final int DEFAULT_SIZE = 2 << 24;
//质数集合,通过这个数组可以创建 6 个不同的哈希函数
private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};
//创建一个位数组
private BitSet bitSets = new BitSet(DEFAULT_SIZE);
//创建数组,存放包含 hash 函数的类的数组
private SimpleHash[] simpleHashes = new SimpleHash[SEEDS.length];
//进行初始化
public MyBloomFilter() {
for (int i = 0; i < simpleHashes.length; i++) {
simpleHashes[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);
}
}
//add
public void add(Object value) {
for (SimpleHash f : simpleHashes) {
bitSets.set(f.hash(value), true);
}
}
//判断指定元素是否存在于位数组
public boolean contains(Object value) {
boolean ret = true;
for (SimpleHash f : simpleHashes) {
//要全部满足
ret = ret && bitSets.get(f.hash(value));
}
return ret;
}
//创建一个内部类用于计算hash值
public static class SimpleHash {
private int cap;
private int seed;
public SimpleHash(int cap, int seed) {
this.cap = cap;
this.seed = seed;
}
//一个用于计算hash的方法
public int hash(Object value) {
int h;
//????
return (value == null) ? 0 : Math.abs(seed * (cap - 1) & ((h = value.hashCode()) ^ (h >>> 16)));
}
}
}
2.Google开源 Guava 自带的布隆过滤器
(依赖)
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
网友评论