Hacker News new | ask | show | jobs
by lunixbochs 4396 days ago
You can brute force it insanely fast by iterating from the rightmost character and caching the entire hash prefix.

This hash doesn't scramble input very well, so you can fiddle with individual characters to converge on any desired hash value.

Record the "closest" hash value to your target generated by this loop, apply (only) that character change, repeat. If the hash value stops converging, add a character. This naive version pretty often does the job in 5 full iterations or so, which means (5 * len(s) * len(alphabet)) = maybe ~3000 total hashes to get a solution.

    for i in xrange(len(s)):
        copy = s
        for c in alphabet:
            copy[i] = c
            diff = abs(hash(copy) - 666)
            best = min(diff, best)