Python Unash Value

Soy un novato en la python. ¿Puedo descifrar, o más bien cómo puedo descifrar un valor? Estoy usando la función std hash (). Lo que me gustaría hacer es primero hacer un hash de un valor, enviarlo a algún lugar y luego destrabarlo como tal:

#process X hashedVal = hash(someVal) #send n receive in process Y someVal = unhash(hashedVal) #for example print it print someVal 

Gracias por adelantado

No se puede hacer.

Un hash no es una versión comprimida del valor original, es un número (o algo similar) derivado del valor original. La naturaleza de las implementaciones de hash es que es posible (pero estadísticamente poco probable si el algoritmo de hash es bueno) que dos objetos diferentes produzcan el mismo valor de hash.

Esto se conoce como el principio del casillero que básicamente establece que si tiene N elementos diferentes y desea colocarlos en M categorías diferentes, donde el número N es mayor que M (es decir, más elementos que categorías), terminar con algunas categorías que contienen varios elementos. Dado que un valor de hash suele ser mucho más pequeño en tamaño que los datos que tiene, sigue los mismos principios.

Como tal, es imposible regresar una vez que tenga el valor hash. Necesita una forma diferente de transportar datos que esta.

Por ejemplo, un algoritmo hash de ejemplo (pero no muy bueno) sería calcular el módulo numérico 3 (es decir, el rest después de dividir por 3). Entonces tendrías los siguientes valores de hash de números:

 1 --> 1 <--+- same hash number, but different original values 2 --> 2 | 3 --> 0 | 4 --> 1 <--+ 

¿Estás tratando de usar la función hash de esta manera para:

  • Ahorre espacio (ha observado que el valor de hash es mucho más pequeño en tamaño que los datos originales)
  • Transporte seguro (usted ha observado que el valor de hash es difícil de revertir)
  • Datos de transporte (usted ha observado que el número / cadena de hash es más fácil de transportar que una jerarquía de objetos complejos)

...?

Saber por qué quiere hacer esto podría darle una mejor respuesta que simplemente " no se puede hacer ".

Por ejemplo, para las 3 observaciones diferentes anteriores, aquí hay una manera de hacer cada una de ellas correctamente:

  • Compresión / descompresión, por ejemplo, utilizando gzip o zlib (los dos normalmente disponibles en la mayoría de los lenguajes de progtwigción / tiempos de ejecución)
  • Cifrado / descifrado, por ejemplo, utilizando RSA, AES o un algoritmo de cifrado seguro similar
  • Serialización / Deserialización, que es un código creado para tomar una jerarquía de objetos complejos y producir una representación binaria o textual que luego se puede volver a deserializar en nuevos objetos.

No se pueden “descifrar” datos, las funciones de hash son irreversibles debido al principio de casillero

http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Pigeonhole_principle

Creo que lo que buscas es cifrado / descifrado. (O compresión o serialización como se menciona en otras respuestas / comentarios).

Incluso si estoy casi 8 años tarde con una respuesta, quiero decir que es posible deshacer los datos (aunque no con la hash() std hash() ).

Todas las respuestas anteriores describen funciones hash criptográficas , que por su diseño deberían calcular hashes que son imposibles (o al menos muy difíciles de deshacer).

Sin embargo, este no es el caso con todas las funciones hash.

Solución

Puede usar basehash python lib ( pip install basehash ) para lograr lo que desea.

Sin embargo, hay que tener en cuenta una cosa importante: para poder deshacer los datos, es necesario hacer un hash sin perder datos. Esto generalmente significa que cuanto mayor sea el conjunto de valores y tipos de datos que le gustaría hacer hash, mayor debe ser la longitud de hash para que no tenga colisiones de hash.

De todos modos, aquí hay un ejemplo simple de cómo hash / unfash datos:

 import basehash hash_fn = basehash.base36() # you can initialize a 36, 52, 56, 58, 62 and 94 base fn hash_value = hash_fn.hash(1) # returns 'M8YZRZ' unhashed = hash_fn.unhash('M8YZRZ') # returns 1 

Puede definir la longitud de hash en la inicialización de la función de hash y hash de otros tipos de datos también.

Dejo la explicación de la necesidad de varias bases y longitudes de hash para los lectores que deseen saber más sobre el hash.

Esto no es posible en general. Una función de hash necesariamente pierde información, y el hash de python no es una excepción.