import java.util.HashSet;
import java.util.Set;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnel;
import com.google.common.hash.PrimitiveSink;
public class Main {
public static void main(String[] args) {
final int n = 500;
final Funnel<Integer> funnel = (Integer x, PrimitiveSink into) -> into.putInt(x);
final BloomFilter<Integer> filter = BloomFilter.create(funnel, n);
// 0 から 998 までの偶数を Bloom Filter に追加
for (int i = 0; i < n * 2; i += 2) {
filter.put(i);
}
// すべての偶数が positive であることを確認
for (int i = 0; i < n * 2; i += 2) {
if (!filter.mightContain(i)) {
System.out.printf("%d should be contained!\n", i);
}
}
// 1 から 999 までの奇数で false positive となる値を抽出
final Set<Integer> falsePositives = new HashSet<>();
for (int i = 1; i < n * 2; i += 2) {
if (filter.mightContain(i)) {
falsePositives.add(i);
}
}
System.out.printf("expected false positive probability is %f\n", filter.expectedFpp());
System.out.printf("actual false positive probability is %f\n", (double) falsePositives.size() / n);
System.out.printf("%d false-positives appeared: %s\n", falsePositives.size(), falsePositives);
}
}