Я полагаю, что при выборе словарей, имеющих одинаковое содержимое, но разные истории вставки / удаления, может возникнуть ошибка.
Справа:
>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False
См. Также: pickle.dumps не подходит для хеширования
Моя цель - создать «сигнатуру» аргументов функции, используя Pickle и SHA1, для реализации памятки.
Есть ряд фундаментальных проблем с этим. Невозможно придумать преобразование объекта в строку, которое правильно отображает равенство - подумайте о проблеме идентичности объекта:
>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True
В зависимости от ваших точных требований, вы можете преобразовать иерархии объектов в те, которые вы можете затем хешировать:
def hashablize(obj):
"""Convert a container hierarchy into one that can be hashed.
Don't use this with recursive structures!
Also, this won't be useful if you pass dictionaries with
keys that don't have a total order.
Actually, maybe you're best off not using this function at all."""
try:
hash(obj)
except TypeError:
if isinstance(obj, dict):
return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems()))
elif hasattr(obj, '__iter__'):
return tuple(hashablize(o) for o in obj)
else:
raise TypeError("Can't hashablize object of type %r" % type(obj))
else:
return obj