布隆过滤器应用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