布隆过滤器应用DEMO

Posted chinano1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布隆过滤器应用DEMO相关的知识,希望对你有一定的参考价值。

引入jar包

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>21.0</version>
    </dependency>

代码示例:

 1 public class BloomFilterDemo {
 2     private static final int insertions = 1000000;
 3 
 4     public static void main(String[] args) {
 5         //初始化一个存储string的布隆过滤器,初始大小100w 默认误判率是0.03
 6         BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(UTF_8), insertions,0.01);
 7         //用于存放所有实际存在的key,判断key是否存在
 8         Set<String> sets = new HashSet<>();
 9         //用于存放所有实际存在的key,可以取出使用
10         List<String> list = new ArrayList<>(insertions);
11         //向三个容器初始化100w个随机并且唯一的字符串
12         for (int i = 0; i < insertions; i++) {
13             String uuid = UUID.randomUUID().toString();
14             bf.put(uuid);
15             sets.add(uuid);
16             list.add(uuid);
17         }
18 
19         int right = 0;//正确判断的次数
20         int wrong = 0;//错误判断的次数
21         for (int i = 0; i < 10000; i++) {
22             String data = i % 100 == 0 ? list.get(i / 100) : UUID.randomUUID().toString();
23             if (bf.mightContain(data)) {
24                 if (sets.contains(data)){
25                     // 判断实际存在
26                     right++;
27                     continue;
28                 }
29                 //布隆过滤器判断存在,但实际不存在
30                 wrong++;
31             }
32         }
33         float percent = (float)wrong / 9900;
34         System.out.println("100个实际存在的元素,判断存在的:" + right);
35         System.out.println("9900个实际不存在的元素,误认为存在的:" + wrong + ",误判率:" + percent);
36     }
37 }

输出结果:

100个实际存在的元素,判断存在的:100
9900个实际不存在的元素,误认为存在的:97,误判率:0.00979798

 

以上是关于布隆过滤器应用DEMO的主要内容,如果未能解决你的问题,请参考以下文章

浅析布隆过滤器及实现demo

哈希的应用

手撕STLbitset(位图)布隆过滤器

手撕STLbitset(位图)布隆过滤器

手撕STLbitset(位图)布隆过滤器

BloomFilter怎么用?使用布隆过滤器来判断key是否存在?