简易实现如下:
长度100的int数组,5个hash函数
public class Main {
public static void main(String[] args) {
int i = 1;
String string = "1";
double d = 1;
float f = 1;
BloomFilter.addElement(i);
BloomFilter.addElement(string);
BloomFilter.addElement(d);
BloomFilter.addElement(f);
System.out.println(BloomFilter.contains(i));
System.out.println(BloomFilter.contains(string));
System.out.println(BloomFilter.contains(d));
System.out.println(BloomFilter.contains(f));
System.out.println(BloomFilter.contains("xxx"));
System.out.println(BloomFilter.contains(123));
}
}
class BloomFilter {
private final static int size = 100;
private final static int[] intArr = new int[size];
private static int hash1(Object object) {
return Math.abs(Objects.hash(object, 1)) % size;
}
private static int hash2(Object object) {
return Math.abs(Objects.hash(object, 2)) % size;
}
private static int hash3(Object object) {
return Math.abs(Objects.hash(object, 3)) % size;
}
private static int hash4(Object object) {
return Math.abs(Objects.hash(object, 4)) % size;
}
private static int hash5(Object object) {
return Math.abs(Objects.hash(object, 5)) % size;
}
public static void addElement(Object o) {
int tmp = hash1(o);
intArr[tmp] = 1;
tmp = hash2(o);
intArr[tmp] = 1;
tmp = hash3(o);
intArr[tmp] = 1;
tmp = hash4(o);
intArr[tmp] = 1;
tmp = hash5(o);
intArr[tmp] = 1;
}
public static boolean contains(Object o) {
System.out.println(Arrays.toString(intArr));
int tmp = -1;
tmp = hash1(o);
if (intArr[tmp] == 0) {
return false;
}
tmp = hash2(o);
if (intArr[tmp] == 0) {
return false;
}
tmp = hash3(o);
if (intArr[tmp] == 0) {
return false;
}
tmp = hash4(o);
if (intArr[tmp] == 0) {
return false;
}
tmp = hash5(o);
if (intArr[tmp] == 0) {
return false;
}
return true;
}
}