架构师训练营第 1 期第五周作业

用户头像
Leo乐
关注
发布于: 2020 年 10 月 25 日



  1. 用你熟悉的编程语言实现一致性 hash 算法。

  2. 编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。



using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace HashRing
{
public class HashRingManager
{
private readonly SortedList<long, string> VNodes;
private HashAlgorithm HashAlg;
public HashRingManager(List<string> nodes, int vNodeNumebr)
{
VNodes = new SortedList<long, string>();
foreach (string node in nodes)
{
for (int i = 0; i < vNodeNumebr / 4; i++)
{
byte[] digest = HashAlgorithm.ComputeMd5(node + i);
for (int h = 0; h < 4; h++)
{
long m = HashAlgorithm.Hash(digest, h);
VNodes[m] = node;
}
}
}
}
public string GetPrimary(string key)
{
byte[] digest = HashAlgorithm.ComputeMd5(key);
return GetNode(HashAlgorithm.Hash(digest, 0));
}
private string GetNode(long hash)
{
long key = hash;
if (!VNodes.ContainsKey(key))
{
var tailMap = from node in VNodes
where node.Key > hash
select new { node.Key };
if (tailMap == null || tailMap.Count() == 0)
key = VNodes.FirstOrDefault().Key;
else
key = tailMap.FirstOrDefault().Key;
}
return VNodes[key];
}
}
public class HashAlgorithm
{
public static long Hash(byte[] digest, int nTime)
{
long rv = ((long)(digest[3 + nTime * 4] & 0xFF) << 24)
| ((long)(digest[2 + nTime * 4] & 0xFF) << 16)
| ((long)(digest[1 + nTime * 4] & 0xFF) << 8)
| ((long)digest[0 + nTime * 4] & 0xFF);
return rv & 0xffffffffL; /* Truncate to 32-bits */
}
public static byte[] ComputeMd5(string key)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] keyBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(key));
md5.Clear();
return keyBytes;
}
}
}



用户头像

Leo乐

关注

还未添加个人签名 2018.10.17 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第1期第五周作业