d-Left Counting Bloom Filter (2)

关于d-left hashing,上一篇文章已经介绍过了,这里不再多讲。前面提到过,使用d-left hashing是为了解决哈希表的负载平衡问题。为了了解d-left hashing如何解决这个问题,我们先来看没有d-left hashing的情况。同一个hash value高位用作地址低位用作fingerprint,这就意味着同一个地址对应着多个fingerprint。一个地址对应一个bucket,因此一个bucket需要存储多个fingerprint。由于单个哈希函数的hash value分布不均,各个bucket的负载也不均衡。如果每个bucket能存储的fingerprint数量固定,为了不溢出必须按最坏的情况来分配bucket的容量,这就造成了不小的浪费。

 

使用d-left hashing之后,fingerprint的分布相对比较均衡,因此大大减少了空间的浪费。原来即使分配很大的哈希表,由于按最坏情况分配bucket容量,仍然很难缩小bucket的容量,并且哈希表中大量空间闲置。而使用d-left hashing可以让存储的信息分布均匀,更加紧凑,从而用更小的空间存储同样多的信息。在Perfect Hashing VS. Bloom Filter一文中提到过,d-left counting bloom filter可以比counting bloom filter节省至少一倍的空间,就是因为counting bloom filter负载不均衡,很多空间都被浪费掉了。

 

从另一个角度考虑,d-left hashing扮演的其实是一个perfect hash function的角色。原来负载不均衡的情况下,碰撞的情况很严重,使用d-left hashing后大大减少了碰撞。当然,它不能完全消除碰撞,因此它只是用一种开销较小的方式模拟了perfect hash function,可以称它为almost-perfect hash function

 

你可能感兴趣的:(function,filter,存储)