public string GetPrimary(string k) { byte[] digest = HashAlgorithm.ComputeMd5(k); string rv = GetNodeForKey(HashAlgorithm.Hash(digest, 0)); return(rv); }
/// <summary> /// 创建 <see cref="ConsistentHasher"/> 的实例。 /// </summary> /// <param name="nodes">要进行计算的节点集合。</param> /// <param name="fillCountPerNode">填充虚拟节点数(当 <paramref name="nodes"/> 节点过少影响随机分布,应进行填充,最佳效果为 10000 节点,即当有 5 个节点时该参数为 200)。</param> public ConsistentHasher(IEnumerable <string> nodes, int fillCountPerNode = 100) { _nodes = new SortedList <long, string>(); numReps = fillCountPerNode; //对所有节点,生成nCopies个虚拟结点 foreach (string node in nodes) { //每四个虚拟结点为一组 for (int i = 0; i < numReps / 4; i++) { //getKeyForNode方法为这组虚拟结点得到惟一名称 byte[] digest = HashAlgorithm.ComputeMd5(node + i); // Md5是一个16字节长度的数组,将16字节的数组每四个字节一组,分别对应一个虚拟结点,这就是为什么上面把虚拟结点四个划分一组的原因 for (int h = 0; h < 4; h++) { long m = HashAlgorithm.Hash(digest, h); _nodes[m] = node; } } } }