高阶系统设计优化-----Bloom Filter
前传
Alice 是一位事业有成,相貌出众,且身材管理非常得当的优秀女企业家,但随着Alice的年纪越来越大,家里催婚的声音也越来越频繁。直到有一天Alice在电音节上认识了当地的真命天子,但是酒醉的她没有来的及记住他的电话号码,只来的及记住他的名字,叫 William。好在Alice 幸运值max,已经拿到了一串可能的名单和当时参加的电音节名单,但是一个个找是在是太耗费精力了。所以Alice开始寻求我们程序猿的帮助,看看怎么在最短的时间的时间内找到名单上的电话号码是否有出现在当天的电音节名单当中。
布隆过滤器
介绍
布隆过滤器是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
布隆过滤器的重要组成
布隆过滤器本质上是一个位数组,我们通过把一个哈希函数数组与添加值分别做哈希,并把映射到的位数组中的位分别置为1,来判断一个元素是否一定不存在
以下就是一个高度抽象的布隆过滤器:
该布隆过滤器有三个哈希函数(因为对应的每个待插入元素都有三个出箭头),每一个元素经过三次哈希函数的映射,都会映射到下面的位数组里面,比如x元素,经过三次哈希函数的映射,就会映射到位数组的第2位,第6位,第14位。
映射到位数组代表的含义
比如上面举例的x元素,经过三次哈希函数的映射,就会映射到位数组的第2位,第6位,第14位这到底代表什么意思呢?我们可以认为是如果一个元素w到来,我们判断出他在位数组里第2位,第6位,第14位都为1,那么:
- 它可能是x(因为和x在数组中都有相同的置为1的位置)
- 也可能是别的元素(和x一样在数组中都有相同的置为1的位置的元素也是有可能存在的吧?哈希冲突的基本概念)
- 但如果有一位不是1,那它一定不是x(这个很好理解吧?不同的值可能哈希结果相同,但一个值绝对不可能有两个哈希结果)
所以,如果2,6,14中任意一个位置存在0,那么w一定不是x
源代码分析
说了那么多general的东西,我们参照布隆过滤器的代码,来看一下基本的布隆过滤器是如何实现的
首先来看看布隆过滤器的结构体定义(已附上解释说明)