2016-01-06 49 views
-1

我正在尝试编写代码,以便它为每个散列生成唯一的分数。基本上我想要返回同一个节点给多个用户,如果他们请求相同的内容。为散列生成唯一分数的最佳方法是什么

这里是我的代码:

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。我不想将{电影映射到节点}。它应该在运行时进行计算并给出正确的结果。

上面的代码对我来说工作得很好,但有时节点的计算得分变得相同。

我该怎么做才能计算出每个散列的独特分数。

+0

我不明白你想要做什么,你的意思是“分数”,或IP列表和IP地址之间的关系传递给函数是什么。你的函数甚至不在任何地方使用'clientIP'。请举例说明。 – interjay

+0

你可以举例说明md5是相同的吗? –

+0

我并不是说哈希值相同,但计算得分相同。这是一个例子>>> 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

回答

2

解决方案始终将相同的节点分配给相同的请求将仅用请求散列索引节点列表(以列表长度为模)。

#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(request): 
    return nodes[hash(str(request)) % len(nodes)] 
+0

只要节点数量不变,就是这样。 – sorrat

+0

感谢罗布这为我工作。 :) – Maanish

+0

只有当节点长度相同时,当我增加或减少我得到不同的结果>>> selectNodes(“10.10.10.20”,“movie55”) ('192.168.20.5',-209424909) > >> ======================= RESTART >>> selectNodes(“10.10.10.20”,“movie55”) ('192.168.20.5' ,-1462240266) >>> ======================= RESTART: >>> selectNodes(“10.10.10.20”,“movie55”) ('192.168.20.3',1029891531) – Maanish

0

该解决方案不依赖节点顺序,但可能会更改输出,如果新节点将被添加到列表。它使用Murmur3散列函数。

import mmh3 

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 generate_hash(request, node_ip): 
    return mmh3.hash("%s-%s" % (request, node_ip)) 


def select_node(client_ip, request): 
    hashes = [ 
     [generate_hash(request, node_ip), node_ip] 
     for node_ip in nodes 
    ] 
    return sorted(hashes, reverse=True)[0][-1] # sorted by hash 


print select_node("10.10.10.20", "movie2") 
print select_node("10.10.10.10", "movie2") 
相关问题