我有一個包含字典的列表,這反過來又可能包含其他列表和/或詞典,例如有沒有簡單的方法來創建字典列表的散列?
a = [{3:4},{1:2}, {5:[5,6,7,7]} ]
我想以比較它創建一個散列和(或東西等效)這個對象到另一個散列,這在列表內容不同時是不同的。
我需要這個通過網絡進行查詢。我不是一直拉動網絡上可能非常大的列表,而只是得到哈希總和,並且只有當這個總和不同於前面的哈希總和時,我才能通過網絡獲得整個列表。
有一些簡單的方法來做到這一點?
我有一個包含字典的列表,這反過來又可能包含其他列表和/或詞典,例如有沒有簡單的方法來創建字典列表的散列?
a = [{3:4},{1:2}, {5:[5,6,7,7]} ]
我想以比較它創建一個散列和(或東西等效)這個對象到另一個散列,這在列表內容不同時是不同的。
我需要這個通過網絡進行查詢。我不是一直拉動網絡上可能非常大的列表,而只是得到哈希總和,並且只有當這個總和不同於前面的哈希總和時,我才能通過網絡獲得整個列表。
有一些簡單的方法來做到這一點?
你可以用鹹菜
hashlib.md5(pickle.dumps(a[0])).hexdigest()
海峽並非總是如你預期的結果
a = [{3:4},{1:2}, {5:[5,6,7,7]} ]
hash(str(a))
如何做這樣的事情:
# 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([{...},{...}])
「可能非常大」 - 它們大嗎?多大? – rikAtee 2013-03-16 10:32:41
快速&骯髒的方式將是'hashlib.sha256(pickle.dumps(a))。digest()',我想。 – Celada 2013-03-16 10:34:07
如果哈希值必須是唯一的,那麼最終會產生巨大的哈希值,並且不會保存任何流量。您必須爲散列選擇合理的大小,並處理散列衝突的可能性。 – 2013-03-16 10:35:09