Creo que es posible que no se den cuenta de algunas de las sutilezas que entran en esto. El primer problema es que la implementación no define el orden en que los elementos aparecen en un dict. Esto significa que simplemente pidiendo str
de un diccionario no funciona, ya que podría tener
str(d1) == "{'a':1, 'b':2}"
str(d2) == "{'b':2, 'a':1}"
y éstos se hash en diferentes valores. Si tiene elementos sólo hashable en el dict, puede hash de ellos y luego unirse a sus valores hash, como @Bart hace o simplemente
hash(tuple(sorted(hash(x) for x in d.items())))
Nota del sorted
, porque hay que garantizar que la tupla hash sale en el mismo orden, independientemente del orden en que aparezcan los elementos en el dict. Si tiene dicts en el dict, podría recurse esto, pero será complicado.
pero sería fácil de romper cualquier implementación de este tipo si usted permite que datos arbitrarios en el diccionario, ya que simplemente puede escribir un objeto con un roto __hash__
implementación y el uso que. Y no puede usar id
, porque entonces podría tener elementos iguales que se comparan diferentes.
La moraleja de la historia es que los dictados hash no son compatibles en Python por una razón.
¿Qué contiene tu dict? Si solo se trata de cadenas (por ejemplo), simplemente podría hash la representación de cadena ordenada: 'hash (repr (sorted (my_dict.items())))'. – katrielalex
¿Qué es información abstracta? La estabilidad y la funcionalidad del algoritmo dict-hash depende en gran medida de los datos que contiene. Por ejemplo, ¿qué pasa si tienes un dict de dicts? – katrielalex
estos tipos de datos: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html – sahid