java中BloomFilter(布隆过滤器)简单使用

摘要:
简介布隆过滤器适合大数据判重的场景,如网络爬虫中判断一个URL是否已经爬取过,判断一个用户是否在黑名单中,判断一个邮件是否是垃圾邮件,等等。简单使用java中的Guava工具包提供了BloomFilter的实现。bloomFilter.mightContain){System.out.println;}}Listlist=newArrayList;for{if{list.add;}}System.out.println;}}输出结果为有误伤的数量:330可以看到,不会有坏人逃脱,但会有误伤,误伤率大概为3%。参考BloomFilter布隆过滤器使用Bloomfilter的应用场景

简介

布隆过滤器适合大数据判重的场景,如网络爬虫中判断一个URL是否已经爬取过,判断一个用户是否在黑名单中,判断一个邮件是否是垃圾邮件,等等。
优点:占用空间小,效率高,简而言之,就是以正确率换空间和时间。
缺点:有一定的误判率,一个URL经过布隆过滤器判断没爬取过,那么一定没爬取过,一个URL经过布隆过滤器判断爬取过,可能并没有爬取过,这种情况会有误判。
布隆过滤器本身是基于位图的,是对位图的一种改进,位图在java中的实现就是BitSet。

简单使用

java中的Guava工具包提供了BloomFilter的实现。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>27.1-jre</version>
</dependency>
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.ArrayList;
import java.util.List;

public class Client {

  public static void main(String[] args) {
    int size = 1_000_000;
    BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size);
    for (int i = 0; i < size; i++) {
      bloomFilter.put(i);
    }
    for (int i = 0; i < size; i++) {
      if (!bloomFilter.mightContain(i)) {
        System.out.println("有坏人逃脱了");
      }
    }
    List<Integer> list = new ArrayList<>(1000);
    for (int i = size + 10000; i < size + 20000; i++) {
      if (bloomFilter.mightContain(i)) {
        list.add(i);
      }
    }
    System.out.println("有误伤的数量:" + list.size());
  }

}

输出结果为

有误伤的数量:330

可以看到,不会有坏人逃脱,但会有误伤,误伤率大概为3%。
java中BloomFilter(布隆过滤器)简单使用第1张

这种情况下大概要使用内存为7298440bit,约0.87M。
java中BloomFilter(布隆过滤器)简单使用第2张

我们将误伤率改为0.0003

BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.0003);

误伤数量为2,使用内存为16883499bit,约2.013M。
java中BloomFilter(布隆过滤器)简单使用第3张

参考

BloomFilter布隆过滤器使用
Bloomfilter 的应用场景

免责声明:文章转载自《java中BloomFilter(布隆过滤器)简单使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle经典书籍介绍nginx发布的nginScript下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

字符串转数字的hash函数-布隆过滤器

布隆过滤器(Bloom Filter) 是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 基本概念 编辑 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较...

Redis布隆过滤器

一、布隆过滤器使用场景 比如有如下几个需求: ①、原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中? 解决办法一:将10亿个号码存入数据库中,进行数据库查询,准确性有了,但是速度会比较慢。 解决办法二:将10亿号码放入内存中,比如Redis缓存中,这里我们算一下占用内存大小:10亿*8字节=8GB,通过内存查询...