Я думаю, вы можете не осознавать некоторые тонкости, которые к этому относятся.Первая проблема состоит в том, что порядок, в котором элементы появляются в dict, не определяется реализацией.Это означает, что простой запрос str
dict не работает, потому что у вас может быть
str(d1) == "{'a':1, 'b':2}"
str(d2) == "{'b':2, 'a':1}"
, и они будут хэшироваться до различных значений.Если в диктовке есть только хешируемые элементы, вы можете их хешировать, а затем объединить их хэши, как это делает @ Барт или просто
hash(tuple(sorted(hash(x) for x in d.items())))
Обратите внимание на sorted
, потому что выдолжны убедиться, что хешированный кортеж выходит в том же порядке, независимо от того, в каком порядке элементы появляются в dict.Если у вас есть диктат в диктовке, вы можете повторить это, но это будет сложно.
НО будет легко сломать любую реализацию, подобную этой, если вы разрешите произвольные данные в словаре, поскольку вы можете просто написать объект с нарушенной реализацией __hash__
и использовать его.И вы не можете использовать id
, потому что тогда у вас могут быть равные элементы, которые сравниваются по-разному.
Мораль этой истории заключается в том, что хеширование не поддерживается в Python по какой-то причине.