简介
布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。
结构
布隆过滤器是一个 bit 向量或者说 bit 数组。如果我们要映射一个值到布隆过滤器中,需要经过如下两步:
- 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。
- 根据得到的哈希值,在位数组中把对应下标的值置为 1。
如下图:映射"Hello"到布隆过滤器,首先有三个不同的哈希函数分别对"Hello"求值,映射到三个不同的位置:3,5,9。然后把对应位置下标置1。
再存一个值"world",分别经过hash运算后映射到2,4,9的位置。3,5,9已经被"Hello"映射了。
下面如果想查询"boluo",其映射的位置分别为1,2,3。因为2的位置并未置为1,所以认为不存在"boluo"。
而当我们需要查询 “Hello” 这个值是否存在的话,那么哈希函数必然会返回 3,5,9,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “Hello” 存在了么?答案是不可以,只能是 “Hello” 这个值可能存在。
答案很简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “boluo” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置为 1 ,那么程序还是会判断 “boluo” 这个值存在。