2018年6月4日星期一

再谈BloomFilter设计

对于Bloom Filter而言,容量和错误率(False Positive Rate)已经由数学原理确定了。我们要关心的是其性能。Bloom Filter的性能其实就是其中使用的HASH算法的性能。在《选择一种优秀的HASH算法》一文中,我测试了一些著名的HASH算法。由于Bloom Filter每次插入或查询需要多个HASH值,最理想的做法就是计算一个长的HASH,然后把它切成等长的几个短HASH值。以速度和质量而言,最理想的就是MD5或SHA1了。

下面的表格是使用MD5或SHA1时Bloom Filter的特性。以第一行为例,解读为:当HASH长度为32bit时,占用内存512M,使用4个HASH,在错误率为6.25%时,容量为7.44亿个项目。使用MD5算法时,m乘以k的值不得大于128bit,而SHA1则是160bit。

MD5



m (bits)mem (bytes)kfn
3253687091246.25%744268976
3126843545646.25%372134488
3013421772846.25%186067244
296710886446.25%93033622
283355443246.25%46516811
271677721646.25%23258405
26838860846.25%11629202
25419430453.13%4651681
24209715253.13%2325840
23104857653.13%1162920
2252428853.13%581460
2126214461.56%242275
2013107261.56%121137
196553661.56%60568
183276870.78%25958
171638470.78%12979
16819280.39%5678





SHA1



m (bits)mem (bytes)kfn
3253687091253.13%595415181
3126843545653.13%297707590
3013421772853.13%148853795
296710886453.13%74426897
283355443253.13%37213448
271677721653.13%18606724
26838860861.56%7752801
25419430461.56%3876400
24209715261.56%1938200
23104857661.56%969100
2252428870.78%415328
2126214470.78%207664
2013107280.39%90853
196553680.39%45426
183276880.39%22713
171638490.20%10094
168192100.10%4542

通过对比,我发现内存使用量相同的情况下,MD5的错误率稍高,而容量也稍大一点。使用MD5算法要达到和SHA1相同的容量,其错误率会提高0.1%~0.2%。考虑到MD5的速度较快,我觉得这点错误率的上升也是可以接受的,因为实际使用中选择的Bloom Filter容量应该比应用所需容量大一些,而在此前提下,Bloom Filter的错误率是呈指数方式下降的。

没有评论: