作业 -2020 年 10 月 25 日
发布于: 2020 年 10 月 26 日
题目
用你熟悉的编程语言实现一致性 hash 算法。
解答
# coding: UTF-8import bisectimport zlibclass HashServer: def __init__(self): self.hash_node = [] # hash节点 self.node_name = [] # 节点名称 def hash(self, v): return zlib.crc32(v)%(2**32-1) def add_server(self, server): for i in range(0, 4):#vnode name = server + ":*" + str(i) node = self.hash(name) pos = bisect.bisect_right(self.hash_node, node) self.hash_node.insert(pos, node) self.node_name.insert(pos, name) def remove_server(self, server): i = 0 while i < len(self.node_name): if self.node_name[i][:-3]==server: self.node_name.pop(i) self.hash_node.pop(i) else: i = i + 1 def find_server(self, v): node = self.hash(v) pos = bisect.bisect_right(self.hash_node, node) # 二分查找 if pos == len(self.hash_node): pos = 0 return self.node_name[pos]a = HashServer()a.add_server("node1")a.add_server("node2")a.add_server("node3")print "----"for i in range(0, 20): print a.find_server(str(i))[:-3]a.add_server("node4")print "----"for i in range(0, 20): print a.find_server(str(i))[:-3]a.remove_server("node4")print "----"for i in range(0, 20): print a.find_server(str(i))[:-3]
简略实现:
vnode 采用node:*(0-4)
hash采用crc32
环用数组模拟
新增服务器3台->新增1台->删除1台
结果如下:
----node3node3node2node3node3node3node2node3node3node3node1node1node2node1node1node1node2node1node2node1----node4node4node2node3node4node4node2node3node4node4node1node1node2node1node1node1node2node1node2node1----node3node3node2node3node3node3node2node3node3node3node1node1node2node1node1node1node2node1node2node1
划线
评论
复制
发布于: 2020 年 10 月 26 日 阅读数: 8
芝麻酱
关注
还未添加个人签名 2017.10.18 加入
还未添加个人简介
评论