

你真的了解bloom filter吗?
source link: https://www.tuicool.com/articles/vEFNbuM
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

当系统设计中出现多级缓存结构时,为了防止大量不存在的key值击穿高速缓存(比如主存),去直接访问低速缓存(如本地磁盘),我们一般需要将这部分key值,直接拦截在高速缓存阶段。这里,当然可以使用普通的hash table,也可以使用bitmap,但是这两种方式都比较耗费内存,当面对海量key值时,问题会变得更加严重。这时,就该介绍我们的主角bloom filter出场了。
一般的,bloom filter用于判断一个key值是否在一个set中,拥有比hash table/bitmap更好的空间经济性。如果bloom filter指示一个key值“不在”一个set中,那么这个判断是100%准确的。这样的特性,非常适合于上述的缓存场景。
原理
- 首先估计要判断的set中的元素个数N,然后选定k个独立的哈希函数。根据N和k,选定一个长度为M的bit array。
- 遍历set中的N个元素
- 对每个元素,使用k个哈希函数,得到k个哈希值(一般为一个大整数)
- 将上述bit array中,k个哈希值所对应的bit置1
- 对于需要判断的key值
- 使用k个哈希函数,得到k个哈希值
- 如果k个哈希值所对应的bit array中的值均为1,则判断此值在set中 “可能” 存在;
- 否则,判定 “一定” 不存在
优缺点
- 优点:
- 插入、查找都是常数时间
- 多个hash函数之间互相独立,可以并行计算
- 不需要存储元素本身,从而带来空间效率优势,以及一些保密上的优势
- bloom filter的bitmap可以进行交、并、差运算
- 缺点:
- 不准确:不在集合中的元素也有可能被判定在集合中
- 无法删除:
- 容易想到,可以将bitmap(0-1)变成可以计数的bitmap(0-1-2—-n),然后删除key时进行减法。
- 但是,这样还是有问题:万一删除的元素本来就不在集合中呢?然鹅,又无法准确的判断一个元素是否在集合中(有概率误判)
扩展
- 谷歌的BigTable中,就使用到了bloom filter对查询加速
- 预先缓存bloom filter在内存中,用于确定行或列是否“不存在”于磁盘上,从而避免了不必要的磁盘IO。而“不存在”是完全准确的
- 可以看到,Bloom Filter是一个利用概率学来对原始算法进行优化的例子。如果大家还有印象的话,我之前也介绍过一个使用类似思想的算法: Cardinality Estimation
转载请注明出处: http://blog.guoyb.com/2019/06/30/bloomfilter/
欢迎使用微信扫描下方二维码,关注我的微信公众号TechTalking,技术·生活·思考:

Recommend
-
46
Bloom Filter可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,主要缺点是存在一定的误判率:当其判断元素存在时,实际上元素可能并不存在。而当判定不存在时,则元素一定不存在,Bloom Filter...
-
39
Creating a Bloom Filter with Go. A bloom filter is a set-like data…Responses
-
12
Building a Bloom Filter from Scratch Sep 19, 2017 | javadata-structures ...
-
13
How to write a better bloom filter in C April 12, 2016 on Drew DeVault's blog This is in response to
-
18
布隆过滤器是由 Burton Bloom 在 1970 年提出,因此也称为 Bloom Filter。 作用 判断一个元素是否在一个集合 实现 通过一个很长的二进制向量和一系...
-
21
Better bloom filter Based on this implementation it supports multiple hashes for better positive hit ra...
-
11
bitmap和bloom filter都可以对大量数据(通常是超过10亿条)构造集合,当要判断一个新的元素是否在这个大数据集合里面,两种方式都可以准确判断出“新元素不在这个集合”,但是“新元素在这个集合”的判断可能不准,在可以接受误判的系统中,bitmap和bloom filter都可...
-
5
Url排重Bloom Filter 算法、误差及其他 Url排重Bloom Filter...
-
8
位图法就是利用位数组来存储数据状态,其优点就是节省数据存储空间。 布隆过滤器(Bloom Filter)是一种空间效率高的概率数据结构,由 Burton·Howar·Bloom 于1970年构思,用于测试元素是否是一组元素的成员。它实际上就是由一个很长的二...
-
7
POSTED ON JULY 9, 2021 TO Core Data, Data Infrastructure,
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK