Memcached使用分布式一致性散列来选择放置密钥的服务器,但是使用散列算法将字符串密钥映射到应用Ketama算法进行服务器选择的最终散列。这个算法在向不同服务器传播类似密钥方面有多好。
答案 0 :(得分:6)
根据hash.c中的源代码,memcached使用以下算法:
这里使用的哈希函数是Bob Jenkins,1996:
http://burtleburtle.net/bob/hash/doobs.html
“Bob Jenkins,1996。bob_jenkins@burtleburtle.net。 您可以任意方式使用此代码,私人,教育, 或商业的。它是免费的。“
来自Bob Jenkins的网站:
我为哈希表查找提供了一个新的哈希函数,它比你现在使用的哈希表更快更彻底。我还给你一个验证它更彻底的方法。
此外,他的要求是:
- 键是未对齐的可变长度字节数组。
- 有时键是几个这样的数组。
- 有时需要一组独立的哈希函数。
- 平均密钥长度范围为8个字节到200个字节。
- 键可能是字符串,数字,位数组或更奇怪的东西。
- 表格大小可以是任何值,包括2的幂。
- 哈希必须比旧哈希快。
- 哈希必须做得很好。
...
真正的要求是,一个好的哈希函数应该为用户实际使用的密钥统一分配哈希值。
为了回到你的另一个问题,他测量了算法统一分配哈希值的能力,所以我认为哈希在将类似的密钥传播到不同的服务器方面做得很好。如果您有疑虑,代码将被隔离,因此您应该能够运行自己的测试。