我有一个包含字典的列表,这反过来又可能包含其他列表和/或词典,例如有没有简单的方法来创建字典列表的散列?
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