我正在尝试编写代码,以便它为每个散列生成唯一的分数。基本上我想要返回同一个节点给多个用户,如果他们请求相同的内容。为散列生成唯一分数的最佳方法是什么
这里是我的代码:
import hashlib
#define nodes
nodes = ["192.168.20.2", "192.168.20.3", "192.168.20.4", "192.168.20.5", "192.168.20.6", "192.168.20.7"]
def selectNodes(clientIP,request):
hash_list = []
for node_ips in nodes:
score = 0
ready_hash = str(request) + str(node_ips)
m = hashlib.md5((ready_hash).encode("utf-8"))
hashed_node = m.hexdigest()
for char in hashed_node:
score += int(char, 16)
hash_list.append((node_ips, score))
sorted_by_score = sorted(hash_list, key=lambda tup:tup[1], reverse=True)
(node_ip, score) = sorted_by_score[0]
return (node_ip, sorted_by_score)
如果我称之为:
selectNodes("10.10.10.20", "movie1")
假设它返回为192.168.20.2 MOVIE1。下一次当相同或其他用户请求“movie1”时。它应该返回同一个节点192.168.20.2。我不想将{电影映射到节点}。它应该在运行时进行计算并给出正确的结果。
上面的代码对我来说工作得很好,但有时节点的计算得分变得相同。
我该怎么做才能计算出每个散列的独特分数。
我不明白你想要做什么,你的意思是“分数”,或IP列表和IP地址之间的关系传递给函数是什么。你的函数甚至不在任何地方使用'clientIP'。请举例说明。 – interjay
你可以举例说明md5是相同的吗? –
我并不是说哈希值相同,但计算得分相同。这是一个例子>>> selectNodes(“10.10.10.20”,“movie4”) - 输出 ('192.168.20.2',[('192.168.20.2',287),('192.168.20.5',287) ,('192.168.20.3',274),('192.168.20.7',267),('192.168.20.6',242),('192.168.20.4',226)])。所以我们看到192.168.20.2和192.168.20.5具有相同的计算得分。有没有什么逻辑可以计算出独特的分数。 – Maanish