Peter Greek
Peter Greek

Reputation: 27

JS Hash Function Reversal?

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

Answers (1)

T.J. Crowder
T.J. Crowder

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

Related Questions