架构师训练营第 1 期第五周作业
发布于: 2020 年 10 月 25 日
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 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; } }}
划线
评论
复制
发布于: 2020 年 10 月 25 日 阅读数: 10
Leo乐
关注
还未添加个人签名 2018.10.17 加入
还未添加个人简介
评论