Подскажите, как оформить кусок кода с помощью рекурсии

hashes = ["1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad",
          "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
          "74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"]
letters = list("abcdefghijklmnopqrstuvwxyz")
result = {}
for l1 in letters:
    for l2 in letters:
        for l3 in letters:
            for l4 in letters:
                for l5 in letters:
                    word = bytes(l1+l2+l3+l4+l5, encoding='utf-8')
                    if hashlib.sha256(word).hexdigest() in hashes:
                        result[hashlib.sha256(word).hexdigest()] = word
print(result)

Выше сам код.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

itertools.product перебирает все комбинации. Заодно преобразование в байты вынесено из цикла, чтобы его как-то разгрузить.

import hashlib
import itertools


hashes = ["1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad",
          "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
          "74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"]
letters = tuple(bytes(c, encoding='utf-8') for c in "abcdefghijklmnopqrstuvwxyz")
result = {}
for p in itertools.product(letters, repeat=5):
    word = b''.join(p)
    digest = hashlib.sha256(word).hexdigest()
    if digest in hashes:
        result[digest] = word
print(result)
$ time python product.py
{'3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b':
b'apple',
'74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f':
b'mmmmm',
'1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad':
b'zyzzx'}

real  0m12.201s
user  0m12.196s
sys   0m0.004s
→ Ссылка