Bloom Filter (2)

如何选择合适的bitmap大小以及hash函数的个数?

数学分析略,可参见wiki上面的页面(简单的概率论知识),结论如下:

给定允许的错误概率p,以及元素个数n,总的bit数m应为:m >= -n*ln(p) / (ln2) / (ln2)

譬如,如果给定错误率p为0.001,代入可得 m >= 14.4n

给定n和m以后,选择多少个hash function也是一个问题,结论如下:

hash函数的个数k应为:k = m * ln2 / n,也即 k = 0.7 * m / n.

再次用上面的p=0.001的例子,m >= 14.4n, 那么k = 0.7 * 14.4 = 10

如果p=0.005,则 m >= 11.0n, k = 0.7 * 11.0 = 8

一个实际的例子,squid中使用的bloom filter,参见http://wiki.squid-cache.org/SquidFaq/CacheDigests

squid的cache digests。cache digest的用处在于使squid server之间相互知道大家都有哪些页面的缓存。

squid中的bloom filter设计:

1, m/n的值由bits_per_entry确定,目前是5;

2, k的值目前是4;

3, hash function怎么设计的?目前,这四个hash function分别取MD5(URL, http method)的四个int值,然后对m取模;使用这个md5值的原因在于这个值已经应用于其他用途了,所以直接就可以拿来用。

cache digest如何管理?

1, peer之间用标准的http相互取,附带一个失效时间;

2, 自己的cache digest会时不时的重建;


posted @ 2011-05-10 12:49  qsort  阅读(288)  评论(0编辑  收藏  举报