如何选择合适的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会时不时的重建;