2016-01-06 64 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") 
相關問題