【第五周】课后作业

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



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

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



# coding by python3
class HashRing(object):
def __init__(self, nodes=None, replicas=1):
"""hash环
"""
self.replicas = replicas
self.ring = dict()
self._sorted_keys = []
if nodes:
for node in nodes:
self.add_node(node)
def add_node(self, node):
"""加节点入环
"""
for i in range(0, self.replicas):
key = self.get_key('%s:%s' % (node, i))
self.ring[key] = node
self._sorted_keys.append(key)
self._sorted_keys.sort()
def remove_node(self, node):
"""移除节点
"""
for i in range(0, self.replicas):
key = self.get_key('%s:%s' % (node, i))
if key in self.ring:
del self.ring[key]
self._sorted_keys.remove(key)
def get_node(self, string_key):
"""根据key获取节点
"""
return self.get_node_pos(string_key)[0]
def get_node_pos(self, string_key):
"""获取节点位置
"""
if not self.ring:
return None, None
key = self.get_key(string_key)
nodes = self._sorted_keys
for i in range(0, len(nodes)):
node = nodes[i]
if key <= node:
return self.ring[node], i
return self.ring[nodes[0]], 0
def get_key(self, key):
from hashlib import md5
key = key.encode(encoding='utf-8')
m = md5()
m.update(key)
return m.hexdigest()



用户头像

云龙

关注

还未添加个人签名 2018.03.30 加入

还未添加个人简介

评论

发布
暂无评论
【第五周】课后作业