【发布时间】:2012-05-04 01:02:02
【问题描述】:
Memcached 使用分布式一致性哈希来选择将密钥放在哪个服务器上,但它使用哪个哈希算法将字符串密钥映射到应用 Ketama 算法用于服务器选择的最终哈希。该算法在将相似的密钥传播到不同的服务器方面有多好。
【问题讨论】:
Memcached 使用分布式一致性哈希来选择将密钥放在哪个服务器上,但它使用哪个哈希算法将字符串密钥映射到应用 Ketama 算法用于服务器选择的最终哈希。该算法在将相似的密钥传播到不同的服务器方面有多好。
【问题讨论】:
根据hash.c中的源码,memcached使用如下算法:
这里使用的哈希函数是 Bob Jenkins,1996:
http://burtleburtle.net/bob/hash/doobs.html
“鲍勃·詹金斯,1996 年。bob_jenkins@burtleburtle.net。 您可以以任何您希望的方式使用此代码,私人的、教育的、 或商业。它是免费的。”
来自 Bob Jenkins 的网站:
我为您提供了一种用于哈希表查找的新哈希函数,它比您现在使用的更快、更彻底。我也给你一个方法来验证它是否更彻底。
另外,他的要求是:
- 键是未对齐的可变长度字节数组。
- 有时键是几个这样的数组。
- 有时需要一组独立的哈希函数。
- 平均密钥长度从 8 字节到 200 字节不等。
- 键可能是字符串、数字、位数组或更奇怪的东西。
- 表格大小可以是任意值,包括 2 的幂。
- 哈希必须比旧的更快。
- 哈希必须做好。
...
那么真正的要求是一个好的散列函数应该为用户实际使用的键均匀地分配散列值。
回到你的另一个问题,他测量了算法均匀分布散列值的能力,所以我认为散列在将相似的密钥传播到不同的服务器方面做得很好。如果您有顾虑,代码是隔离的,因此您应该能够运行自己的测试。
【讨论】: