2013-03-16 53 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([{...},{...}])

相关问题