In [1]:
#!/usr/bin/env python
import hashlib

def iter_solve(password):
    salt = 0
    while True:
        digest = hashlib.md5(password + str(salt)).hexdigest()
        if digest.startswith('00000'):
            yield digest
        salt += 1

def solve_first(password):
    digests = iter_solve(password)
    return ''.join([digests.next()[5] for dummy in range(8)])

def solve_second(password):
    digests = iter_solve(password)
    solution = [None] * 8
    while None in solution:
        digest = digests.next()
        if digest[5].isdigit() and int(digest[5]) < 8 and solution[int(digest[5])] is None:
            solution[int(digest[5])] = digest[6]
    return ''.join(solution)

In [2]:
# Example, puzzle 1
print solve_first('abc'), '18f47a30'


18f47a30 18f47a30

In [3]:
# Example, puzzle 2
print solve_second('abc'), '05ace8e3'


05ace8e3 05ace8e3

In [4]:
# Solution 1
print solve_first('uqwqemis')


1a3099aa

In [5]:
# Solution 2
print solve_second('uqwqemis')


694190cd