Exemple #1
0
        public string GetPrimary(string k)
        {
            byte[] digest = HashAlgorithm.ComputeMd5(k);
            string rv     = GetNodeForKey(HashAlgorithm.Hash(digest, 0));

            return(rv);
        }
Exemple #2
0
        /// <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;
                    }
                }
            }
        }