d-Left Counting Bloom Filter (1)

来源:互联网 发布:ubuntu最新版 编辑:程序博客网 时间:2024/04/30 14:11
哈希函数的输出值(hash value)通常有两种用途:一种用作地址,比如在哈希表中要存储一个元素,首先要针对这个元素生成一个随机地址;另一种用作fingerprint(或者叫digital summary),比如将密码字符串hash成一个fingerprint,验证时进行核对。今天我要介绍的这种存储信息的方式将以上两种用途结合了起来:一个hash value分作两部分,一部分用作存储地址,另一部分用作fingerprint。
 
你也许会问,这样有什么好处吗?当然有。上篇文章中提到了一种基于perfect hashing的方法,它用了两步存储每个元素的fingerprint。第一步用了一个(perfect)哈希函数生成了这个元素的存储地址,第二步用了另一个哈希函数生成这个元素的fingerprint,然后将fingerprint存储到第一步生成的地址中。由此可见,如果一个hash value能够完成两步工作,就省去了一半的工作量。
 
另外,我们要存储的其实是集合中每个元素的fingerprint,一个哈希函数生成很大的一个hash value会让碰撞的几率很小,从而让false positive的概率变小。通过将这个很大的hash value中的一部分信息用作地址,其实相当于把fingerprint压缩了:信息一点没少,存储位置本身就包含了一部分信息。
 
现在我们使用一个哈希函数,将它的hash value分作两部分,高位部分用作随机地址,低位部分留作fingerprint。如果我们用这一个哈希函数存储一个集合,会有什么问题?在基于perfect hashing的方法中,第一步用的哈希函数是perfect hash function,也就是说一个集合的n个元素会映射到n个bucket中,没有碰撞。由于perfect hash function不能应对变动的集合,并且对大多数应用来说开销太大,所以上述所说的一个哈希函数并不是perfect hash function。由此可知碰撞会产生,并且各个bucket的负载并不均衡,实际上单个哈希函数hash value的分布服从泊松(Poisson)分布。
 
说到这里,文章还没有提到d-Left Counting Bloom Filter,其实上面描述的也就是它的构造过程。我们从一个hash value同时用作地址和fingerprint出发,试图构造一个简洁的存储方式来存储一个集合的fingerprints,现在遇到了一个问题,就是负载不均衡。d-Left Counting Bloom Filter中的d-Left指的是d-Left hashing,解决的就是负载均衡问题。
原创粉丝点击