布隆过滤器中的组合哈希函数

背景

布隆过滤器使用组合哈希函数判定值是否在集合中,这样可以减少内存占用空间,提高空间使用率,具体是怎么做的呢?

哈希函数与冲突率

设想有一个阵列位(例如一个字节有8个阵列位),可用来存放哈希值,那么:

  1. 如果阵列位的容量大小是1,那么存放一个哈希值后,再存放新哈希值的冲突概率是100%(实际是已经满了,再也放不下下了)
  2. 如果阵列位的容量大小是10,那么存放一个哈希值后,再存放新哈希值的冲突概率是10%
  3. 如果阵列位的容量大小是100,那么存放一个哈希值后,再存放新哈希值的冲突概率是1%

而且,随着阵列位的空间不断被填满,新插入的值的冲突率也在上升,是个动态过程。从上面的过程可知,如果要存在N个哈希值,且要求冲突率在0.1%到1%之间,就需要100N到1000N个阵列位,这样的空间效率很低。

布隆过滤器中的组合哈希举例

对于布隆过滤器来说,思路和上面单哈希函数完全不同,允许适当的冲突,利用哈希位重复使用使得空间使用率提高。前面对于100个阵列位,在单哈希函数情况下,存放1个哈希值后再存放新哈希值的冲突概率是1%。

  1. 现在我们使用组合哈希函数,假设有三个哈希函数H1()、H2()、H3(),对于X来说,H1(X)=3,H2(X)=5,H3(X)=7,那么采用组合哈希函数后,对于100个阵列位来说,使用了阵列位的位置是(3,5,7)。
  2. 这时对于新值Y来说,如果Y通过H1、H2、H3的产生的哈希值是(7,3,5)那么对于100个阵列位来说,使用的还是那三个阵列位。也就是说X和Y使用了相同的阵列位,通过这样的操作可以减少阵列位的使用。
  3. 但是这样的方法也有问题,例如:对于要检查Z值,如果映射的哈希值刚好是(5,7,3)那么就相当于说Z值可能是存在的,也可能是不存在的,其实对于Y值来说也是如此…
  4. 当然,如果再来一个K,哈希值是(1,5,7),那么可以肯定的说,K值一定没有记录过在阵列位中。

如果增大阵列位长度,可以减少情况3的发生,如果增加组合HASH函数中的个数,也可以减少情况3的发生。如果情况3发生的太多了,相当于对于任何的值,过滤器都告诉你“不知道”。那就起不到过滤作用了。因此,布隆过滤器相当于是在阵列空间的使用和判断的准确率上做权衡,允许一定的“失误率”(SAY 不知道)。

猜你喜欢

转载自blog.csdn.net/qq_29047189/article/details/106974055
今日推荐