Reputation: 27
I have this function that I found to hash a string, I have been attempting for some hours now to reverse this function to take the hash and return the string. I am not too familiar with left and right shifts, what exactly do they do in the case of this function and would reversing it be even possible? I have used the string "luxor" for my tests and I get "250B0C5E" as the hash but have been unable to get a string back that matches "luxor". I have attempted switching the shifts from left to right and moving the charcodeat but still no success.
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();
}
Upvotes: 0
Views: 1184
Reputation: 1075855
You can't.
Hashing is a one-way process. When it's a two-way process, it's encryption/decryption. They have very different uses.
This is just a hash function. It takes a string (a series of 16-bit values) and produces a single number (an IEEE-754 double-precision floating point value, a "double") which it then turns into a hex string. But in places during that process, the value is reduced to 32 bits because of the bit shift operators, which convert the double to a 32-bit two's complement integer before doing their work, then convert it back to an equivalent double.
You can't reverse that process, it's lossy (it loses information). There isn't room in a 32-bit value to store the information needed to replicate a string of 16-bit values of any length; it could handle two chars without being lossy, or four if you limit the range to chars where the upper byte of the 16-bit value is 0, but that's it.
Upvotes: 1