Tengo esta función que encontré para hacer hash de una cadena, he estado intentando durante algunas horas revertir esta función para tomar el hash y devolver la cadena. No estoy muy familiarizado con los cambios a la izquierda y a la derecha, ¿qué hacen exactamente en el caso de esta función y sería posible revertirla? He usado la cadena "luxor" para mis pruebas y obtengo "250B0C5E" como hash, pero no he podido recuperar una cadena que coincida con "luxor". Intenté cambiar los turnos de izquierda a derecha y mover el código de caracteres, pero aún no tuve éxito.
function HashString(command) { let hash = 0; let string = command.toLowerCase(); for(let i=0; i < string.length; i++) { let letter = string[i].charCodeAt(); hash = hash + letter; hash += (hash << 10 >>> 0); hash ^= (hash >>> 6); hash = hash >>> 0 } hash += (hash << 3); if (hash < 0) { hash = hash >>> 0 } hash ^= (hash >>> 11); hash += (hash << 15); if (hash < 0) { hash = hash >>> 0 } return hash.toString(16).toUpperCase(); }no puedes
Hashing es un proceso unidireccional. Cuando se trata de un proceso bidireccional, se trata de cifrado/descifrado . Tienen usos muy diferentes.
Esta es solo una función hash. Toma una cadena (una serie de valores de 16 bits) y produce un solo número (un valor de punto flotante de doble precisión IEEE-754, un "doble") que luego convierte en una cadena hexadecimal. Pero en algunos lugares durante ese proceso, el valor se reduce a 32 bits debido a los operadores de cambio de bits, que convierten el doble en un entero complemento a dos de 32 bits antes de hacer su trabajo y luego lo vuelven a convertir en un doble equivalente.
No se puede revertir ese proceso, es con pérdidas (pierde información). No hay espacio en un valor de 32 bits para almacenar la información necesaria para replicar una cadena de valores de 16 bits de cualquier longitud; podría manejar dos caracteres sin pérdida, o cuatro si limita el rango a caracteres donde el byte superior del valor de 16 bits es 0, pero eso es todo.