example decrypt python hash sl4a

decrypt - python hash string to int



funciĆ³n hash en python (5)

Con CPython, por razones de eficiencia, hash() en objetos internos devuelve el mismo valor que http://docs.python.org/2/library/functions.html#id que a su vez devuelve la ubicación de la memoria ("dirección") del objeto.

Desde un intérprete basado en CPython a otra ubicación de memoria de dicho objeto, está sujeto a cambios. Dependiendo de su sistema operativo, esto podría cambiar de una ejecución a otra.

Creía que la hash() funciona de la misma manera en todos los intérpretes de python. Pero difiere cuando lo ejecuto en mi móvil usando python para Android . Obtengo el mismo valor de hash para las cadenas y los números de hash, pero cuando tengo tipos de datos incorporados, el valor de hash es diferente.

Intérprete de Python para PC (Python 2.7.3)

>>> hash(int) 31585118 >>> hash("hello sl4a") 1532079858 >>> hash(101) 101

Intérprete de Python móvil (Python 2.6.2)

>>> hash(int) -2146549248 >>> hash("hello sl4a") 1532079858 >>> hash(101) 101

Alguien puede decirme si es un error o entendí mal algo.


Desde Python 3.3, el algoritmo hash predeterminado ha creado valores hash que se salan con un valor aleatorio que es diferente incluso entre diferentes procesos de python en la misma máquina.

La aleatorización de hash solo se implementa actualmente para cadenas, ya que se consideró el tipo de datos más probable capturado desde el exterior que podría ser atacado.

El mismo frozenset produce constantemente el mismo valor hash en diferentes máquinas o incluso en diferentes procesos.

Fuente: https://www.quora.com/Do-two-computers-produce-the-same-hash-for-identical-objects-in-Python


El hash de cosas como int se basa en id (), que no se garantiza una constante entre ejecuciones o entre intérpretes. Es decir, hash (int) siempre producirá el mismo resultado durante la ejecución de un programa, pero es posible que no se compare entre ejecuciones iguales, ya sea en la misma plataforma o en plataformas diferentes.

Por cierto, mientras que la aleatorización de hash está disponible en Python, está desactivada de forma predeterminada. Debido a que sus cadenas y números se distribuyen por igual, claramente no es el problema aquí.


para el viejo Python (al menos, mi Python 2.7), parece que

hash(<some type>) = id(<type>) / 16

y para CPython id() es la dirección en la memoria - http://docs.python.org/2/library/functions.html#id

>>> id(int) / hash(int) 16 >>> id(int) % hash(int) 0

¿Entonces mi conjetura es que el puerto de Android tiene alguna convención extraña para las direcciones de memoria?

de todos modos, dado lo anterior, los hashes para los tipos (y otras incorporaciones que supongo) diferirán entre las instalaciones porque las funciones están en diferentes direcciones.

en contraste, los valores de hashes para los valores (lo que creo que entiendes por "objetos no internos") (antes de que se agregara el material aleatorio) se calculan a partir de sus valores y, por lo tanto, es probable que se puedan repetir.

PD pero hay al menos una arruga más CPython:

>>> for i in range(-1000,1000): ... if hash(i) != i: print(i) ... -1

Hay una respuesta aquí en algún lugar explicando eso ...


hash() se asigna al azar de forma predeterminada cada vez que inicia una nueva instancia de versiones recientes (Python3.3 +) para evitar la inserción de diccionarios en los ataques de DOS

Antes de eso, hash() era diferente para las compilaciones de 32 bits y 64 bits de todos modos.

Si quieres algo que haga hash a la misma cosa cada vez, usa uno de los hashes en hashlib

>>> import hashlib >>> hashlib.algorithms (''md5'', ''sha1'', ''sha224'', ''sha256'', ''sha384'', ''sha512'')