作业 -2020 年 10 月 25 日

用户头像
芝麻酱
关注
发布于: 2020 年 10 月 26 日

题目



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



解答

# coding: UTF-8
import bisect
import zlib
class 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台

结果如下:

----
node3
node3
node2
node3
node3
node3
node2
node3
node3
node3
node1
node1
node2
node1
node1
node1
node2
node1
node2
node1
----
node4
node4
node2
node3
node4
node4
node2
node3
node4
node4
node1
node1
node2
node1
node1
node1
node2
node1
node2
node1
----
node3
node3
node2
node3
node3
node3
node2
node3
node3
node3
node1
node1
node2
node1
node1
node1
node2
node1
node2
node1



用户头像

芝麻酱

关注

还未添加个人签名 2017.10.18 加入

还未添加个人简介

评论

发布
暂无评论
作业-2020年10月25日