bloom Filter布隆过滤器简介

布隆过滤器

一、什么是布隆过滤器?

布隆在1970年提出了布隆过滤器(Bloom Filter),它是一种空间效率极高的概率型算法和数据结构,用于判断一个元素是否在集合中(类似Hashset)。它的核心是一个很长的二进制向量和一系列的hash函数。

基本概念

如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。

Hash面临的问题就是冲突。假设 Hash 函数是良好的,如果我们的位阵列长度为 m 个点,那么如果我们想将冲突率降低到例如 1%, 这个散列表就只能容纳 m/100 个元素。显然这就不叫空间有效了(Space-efficient)。解决方法也简单,就是使用多个 Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,不过直觉上判断这种事情的概率是比较低的。

布隆过滤器的使用场景?

1)垃圾邮件地址过滤(地址数量很庞大)

2)爬虫URL地址去重

3)解决缓存击穿问题

4)浏览器安全浏览网址提醒

5)google 分布式数据库Bigtable以及Hbase使用布隆过滤器来查找不存在的行或列,以减少磁盘查找的IO次数

6)文档存储检索系统也可以采用布隆过滤器来检测先前存储的数据

二、Bloom Filter的特点:

1>、不存在漏报(False Negative),即某个元素在某个集合中,肯定能报出来。
2>、可能存在误报(False Positive),即某个元素不在某个集合中,可能也被爆出来。
3>、确定某个元素是否在某个集合中的代价和总的元素数目无关。

优点:

相比于其它的数据结构,Bloom Filter在空间和时间方面都有巨大的优势。Bloom Filter存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。Bloom Filter不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

缺点:

另外,一般情况下不能从Bloom Filter中删除元素. 我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在Bloom Filter里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

参考

1、缓存击穿之布隆过滤器bloom Filter实现方式
2、布隆过滤器的简单介绍与实例(Bloom Filter)
3、大量数据去重:Bitmap和布隆过滤器(Bloom Filter)
4、Hash和Bloom Filter
5、Bloom filter
6、PHP中实现Bloom Filter算法

你可能感兴趣的:(bloom Filter布隆过滤器简介)