Pregunta Java recrea cadena desde hashcode


¿Hay alguna forma de que pueda usar un código hash de una cadena en java y recrear esa cadena?

p.ej. algo como esto:

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);

Digo esto, porque debo convertir una cadena en un valor entero y reconstruir esa cadena a partir de ese valor entero.


7
2018-06-13 18:27


origen


Respuestas:


Esto es imposible. El código hash para String es con pérdida; muchos valores de cadena darán como resultado el mismo código hash. Un entero tiene 32 posiciones de bit y cada posición tiene dos valores. No hay forma de asignar incluso las cadenas de 32 caracteres (por ejemplo) (cada carácter tiene muchas posibilidades) en 32 bits sin colisiones. Simplemente no caben.

Si desea utilizar una aritmética de precisión arbitraria (por ejemplo, BigInteger), puede tomar cada carácter como un número entero y concatenarlos todos juntos. Voilà.


5
2018-06-13 18:31



No. Multiple Strings puede tener el mismo código hash. En teoría, podrías crear todas las cadenas que tengan ese código hash, pero sería casi infinito.


4
2018-06-13 18:31



Imposible, tengo miedo. Piénselo, un hashcode es un valor largo, es decir, 8 bytes. Una cadena quizás menor que esta, pero también podría ser mucho más larga, no puede exprimir una cadena más larga en 8 bytes sin perder algo.

El algoritmo de código hash de Java suma cada octavo byte si recuerdo correctamente, por lo que perdería 7 de 8 bytes. Si tus cadenas son todas muy cortas, podrías codificarlas como int o long sin perder nada.


2
2018-06-13 18:34



Supongamos que la cadena solo consta de letras, dígitos y signos de puntuación, por lo que hay alrededor de 70 caracteres posibles.

log_70{2^32} = 5.22...

Esto significa que para cualquier número entero dado, encontrará una cadena de 5 o 6 caracteres con este como código hash. Entonces, recuperando "Hello World": imposible; pero "Hello" podría funcionar si tienes suerte


0
2017-08-14 11:58



Por ejemplo, "1019744689" y "123926772" tienen un hashcode de -1727003481. Esto demuestra que para cualquier número entero, puede obtener un resultado diferente (es decir, reversehashcode(hashcode(string)) != string)


0
2017-08-31 19:09