Tôi nghĩ bạn có thể không nhận ra một số sự tinh tế đi sâu vào vấn đề này. Vấn đề đầu tiên là thứ tự các mục xuất hiện trong một dict không được xác định bởi việc thực hiện. Điều này có nghĩa rằng chỉ đơn giản là yêu cầu str
của một dict không làm việc, bởi vì bạn có thể có
str(d1) == "{'a':1, 'b':2}"
str(d2) == "{'b':2, 'a':1}"
và chúng sẽ băm để giá trị khác nhau. Nếu bạn có các mục chỉ hashable trong dict, bạn có thể băm họ và sau đó tham gia lên băm của họ, như @Bart làm hoặc chỉ đơn giản là
hash(tuple(sorted(hash(x) for x in d.items())))
Lưu ý sorted
, bởi vì bạn phải đảm bảo rằng các tuple băm đi ra trong cùng một thứ tự bất kể thứ tự các mục xuất hiện trong dict. Nếu bạn có dicts trong dict, bạn có thể recurse này, nhưng nó sẽ được phức tạp.
NHƯNG sẽ dễ dàng thực hiện bất kỳ việc thực hiện nào như thế này nếu bạn cho phép tùy ý dữ liệu trong từ điển, vì bạn có thể chỉ cần viết một đối tượng bị hỏng __hash__
triển khai và sử dụng. Và bạn không thể sử dụng id
, bởi vì sau đó bạn có thể có các mục bằng nhau so sánh khác nhau.
Yếu tố đạo đức của câu chuyện là các băm băm không được hỗ trợ trong Python vì một lý do.
Dict của bạn chứa gì? Nếu nó chỉ là chuỗi (nói) bạn chỉ có thể băm đại diện chuỗi được sắp xếp: 'hash (repr (được sắp xếp (my_dict.items())))'. – katrielalex
Dữ liệu trừu tượng là gì? Sự ổn định và làm việc của thuật toán băm dict phụ thuộc mạnh vào dữ liệu mà nó nắm giữ. Ví dụ, nếu bạn có một dict của dicts? – katrielalex
các loại dữ liệu sau: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html – sahid