0

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();
}
1
  • well some hash functions can't be reversed and only thing to do is brute force it Commented Feb 17, 2022 at 8:00

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.