2013-03-16 69 views
2

我有一個包含字典的列表,這反過來又可能包含其他列表和/或詞典,例如有沒有簡單的方法來創建字典列表的散列?

a = [{3:4},{1:2}, {5:[5,6,7,7]} ] 

我想以比較它創建一個散列和(或東西等效)這個對象到另一個散列,這在列表內容不同時是不同的。

我需要這個通過網絡進行查詢。我不是一直拉動網絡上可能非常大的列表,而只是得到哈希總和,並且只有當這個總和不同於前面的哈希總和時,我才能通過網絡獲得整個列表。

有一些簡單的方法來做到這一點?

+0

「可能非常大」 - 它們大嗎?多大? – rikAtee 2013-03-16 10:32:41

+0

快速&骯髒的方式將是'hashlib.sha256(pickle.dumps(a))。digest()',我想。 – Celada 2013-03-16 10:34:07

+0

如果哈希值必須是唯一的,那麼最終會產生巨大的哈希值,並且不會保存任何流量。您必須爲散列選擇合理的大小,並處理散列衝突的可能性。 – 2013-03-16 10:35:09

回答

2

你可以用鹹菜

hashlib.md5(pickle.dumps(a[0])).hexdigest() 

海峽並非總是如你預期的結果

0
a = [{3:4},{1:2}, {5:[5,6,7,7]} ] 
hash(str(a)) 
1

如何做這樣的事情:

# imports 
import copy 

def make_hash(x): 
    # Check if arg is a list, tuple or set 
    if isinstance(x, (set, tuple, list)): 
     return tuple([make_hash(y) for y in x]) 

    # Check if arg is not a dict 
    elif not isinstance(x, dict): 
     return hash(x) 

    new = copy.deepcopy(x) 
    for k,v in new.items(): 
     new[k] = make_hash(v) 
    return hash(tuple(frozenset(new.items()))) 

,然後你可以簡單地做make_hash([{...},{...}])

相關問題