<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
public class App {
private static final int insertions = 100000;
private static double fpp = 0.02;
public static void main(String[] args) {
BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), insertions, fpp);
Set<String> sets = new HashSet<String>(insertions);
List<String> lists = new ArrayList<String>(insertions);
for (int i = 0; i < insertions; i++) {
String uuid = UUID.randomUUID().toString();
bf.put(uuid);
sets.add(uuid);
lists.add(uuid);
}
int rightNum = 0;
int wrongNum = 0;
for (int i = 0; i < 10000; i++) {
String data = i % 100 == 0 ? lists.get(i / 100) : UUID.randomUUID().toString();
if (bf.mightContain(data)) {
if (sets.contains(data)) {
rightNum++;
continue;
}
wrongNum++;
}
}
System.out.println(rightNum);
System.out.println(wrongNum);
BigDecimal percent = new BigDecimal(wrongNum).divide(new BigDecimal(9900), 2, RoundingMode.HALF_UP);
BigDecimal bingo = new BigDecimal(9900 - wrongNum).divide(new BigDecimal(9900), 2, RoundingMode.HALF_UP);
System.out.println("在100W個元素中,判斷100個實際存在的元素,布隆過濾器認爲存在的:" + rightNum);
System.out.println("在100W個元素中,判斷9900個實際不存在的元素,誤認爲存在的:" + wrongNum + ",命中率:" + bingo + ",誤判率:" + percent);
}
}