布隆过滤器

布隆过滤器是一种用于快速判断元素是否可能存在于大规模集合中的概率型数据结构,常用于URL去重、垃圾邮件过滤等场景。它通过多个哈希函数映射到位数组,存在一定的误判率,但空间效率高。Google的Guava库提供了实现。本文介绍了其原理、优缺点,并展示了Java代码示例。
摘要由CSDN通过智能技术生成

迅速判断一个元素是否在集合中

解决大规模数据下不需要精准过滤的场景 

使用场景

  • 网络爬虫对URL的去重,避免爬取相同的URL地址 
  • 反垃圾邮件,从数十亿个垃圾邮件列表判断是否为垃圾邮箱 
  • 缓存穿透   

原理

维护一个全为0的bit数组

误判率:数组越长,误判率越低,所占空间越大。 数组越短,误判率越高,所占空间越小。

假设我们生成10位的数组,以及两个hash函数,f1,f2。

假设输入集合N1,N2 ,f1(N1) = 2 ,f2(N2) =5 ,那么数组下标2 和小标5的值就从0重置为1.

假如有第三个数N3,我们判断集合是否在(N1,N2)中,那么进行f1(N3),f2(N3) 如果值为1那么命中了。

google的布隆过滤器

创建BloomFilter的时候,可以指定误判率,这个值必须大于0。

实例

<!--google的布隆过滤器-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
public class BloomFilterTest {
private static int size = 1000000;
//Google的布隆过滤器
private static BloomFilter<Integer> bloomFilter
=BloomFilter.create(Funnels.integerFunnel(), size,0.0001);
public static void main(String[] args) {


//放一百万个key到布隆过滤器中 1000000
for (int i = 0; i < size; i++) {
bloomFilter.put(i);
}
List<Integer> list = new ArrayList<Integer>(1000);
//取10000个不在过滤器里的值,看看有多少个会被认为在过滤器里
for (int i = size + 10000; i < size + 20000; i++) {
if (bloomFilter.mightContain(i)) {
list.add(i);
}
}
System.out.println("误判的数量:" + list.size());
}

优点:

  1. 思路简单 
  2. 保证一致性
  3. 性能强

缺点:

  1. 代码复杂度增大 
  2. 需要另外维护一个集合来存放缓存的key  
  3.  布隆过滤器不支持删除操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值