La función hash()
no es lo que desea; encontrar una manera confiable de serializar el objeto (por ejemplo, str()
o repr()
) y ejecutarlo a través de hashlib.md5()
probablemente sería mucho más preferible.
En detalle - hash()
está diseñado para devolver un entero que identifica de manera única un objeto solo dentro de su vida útil. Una vez que el programa se ejecuta nuevamente, la construcción de un nuevo objeto de hecho puede tener un hash diferente. Destruir un objeto significa que hay una posibilidad de que otro objeto tenga ese hash en el futuro. Consulte la definición de Python de hashable para obtener más información.
Detrás de escena, la mayoría de los objetos de pitón definidos por el usuario se vuelven a id()
para proporcionar su valor hash. Si bien se supone que no debe hacer uso de esto, id(obj)
y por lo tanto hash(obj)
generalmente se implementa (por ejemplo, en CPython) como la dirección de memoria del objeto Python subyacente. Por lo tanto, puedes ver por qué no se puede confiar en nada.
El comportamiento que ve actualmente solo es confiable para ciertos objetos incorporados de python, y no muy lejos. hash({})
por ejemplo, no es posible.
En cuanto hashlib.md5(str(obj))
o equivalente - que necesita para asegurarse de str(obj)
es fiable la misma. En particular, si tiene un diccionario en ejecución dentro de esa cadena, es posible que no enumere sus claves en el mismo orden. También puede haber diferencias sutiles entre las versiones de Python ... Definitivamente recomendaría pruebas de unidad para cualquier implementación en la que confíe.
Para esto, necesitas un "str" estable, que creo que es cierto. – kennytm
@KennyTM: Sí, los resultados de 'str()' deberían ser los mismos en todas las plataformas e implementaciones. – nmichaels
Eso es lo que estaba pensando, igual de sencillo también. Gracias – daniel