Perfect Hashing VS. Bloom Filter

Perfect Hashing VS. Bloom Filter

Network Applications of Bloom Filters: A Survey一文中,作者提到了一种基于Perfect hashing的方法,它在维持同样错误率的情况下比Bloom Filter占用更少的空间。但是这种方法只能使用在静态集合上,一旦集合发生变化,就需要进行重新计算。

 

假设我们要表示的静态集合Xn个元素,我们针对它可以找到一个perfect hash function,记作hx : [1…u] [1…n]。所谓perfect hash function,即它针对不同的key能产生不同的hash value,也就是说没有collision。如果针对不同的key产生不同的hash value,且hash value分布在连续的整数区间内,则称之为minimal perfect hash function,或者minimal perfect hashing。所以上面提到的函数hx严格来说是一个minimal perfect hash function

 

有了hx,我们就可以将X映射到n个连续的格子(bucket)中,每个元素对应其中一个格子。下面我们还需要另一个hash function,它针对每个元素完全随机地生成j位长的hash value,然后将hash value作为这个元素的fingerprint存储在对应的格子里。记这个函数为φ: [1…u] [0…2j-1]

 

有了hx和φ,我们就可以分两步将X映射到一个m = n .j位的内存中,且查找的错误率为1/2j,因为只有在jfingerprint完全吻合的情况下才会出现false positive。在Bloom Filter概念和原理一文中,我们提到过Bloom Filter的错误率为(1/2)k (1/2)mln2/n因此当m = n .j时,Bloom Filter的错误率为(0.6185)j,高于这种基于perfect hashing的方法。如果Bloom Filter要保持1/2j的错误率,必须有m = n .j / ln2,因此所占空间是基于perfect hashing方法的1 / ln2倍。

 

这种方法看起来很诱人,可惜只能用在静态集合上。在一些本身就具有静态集合特征的应用场合下,比如某种程序设计语言的关键字,或者某张光盘里的文件目录,它可以作为一种节省空间的方法得以应用。后续的文章中还会介绍一种d-left counting bloom filter,它借鉴了这种基于perfect hashing的方法,在保留counting bloom filter功能的前提下比它节省了大约一半空间。

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