Генератор всех возможных 8 символов строки. Грубая сила 8 символов пароля. питон
Мне нужно написать генератор, который выдает все возможные 8 символов строки. Из массива символов вот так:
leters = ['1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m']
Скелет выглядит так:
def generator():
"""
here algorithm
"""
yield string
Предположим, чтобы вернуть список, как это ['00000001','00000002','00000003', ......'mmmmmmmm']
3 ответа
itertools.combinations()
а также itertools.combinations_with_replacement()
вернуть генератор
>>> letters = ['a', 'b', 'c']
>>> from itertools import combinations
я использую print()
в примерах, чтобы проиллюстрировать вывод. Заменить его yield
, чтобы получить генератор.
>>> for c in combinations(letters, 2):
print(c)
...
('a', 'b')
('a', 'c')
('b', 'c')
>>> for c in combinations(letters, 2):
print(''.join(c))
...
ab
ac
bc
>>>
>>> for c in itertools.combinations_with_replacement(letters, 2):
print(''.join(c))
...
aa
ab
ac
bb
bc
cc
Если вы используете грубую силу для всех 8-буквенных паролей, содержащих английские буквы и цифры, вам нужно перебрать ~ 2,8 триллиона строк
РЕДАКТИРОВАТЬ Если вы как-то знаете, что нет повторяющихся элементов, используйте permutations
>>> for c in itertools.permutations(letters, 2):
print(''.join(c))
...
ab
ac
ba
bc
ca
cb
это дает вам и б, и ба
Для самой общей последовательности перебора используйте itertools.product()
как в решении Cosmologicon
itertools.product(leters, repeat=8)
РЕДАКТИРОВАТЬ: чтобы он дал вам строки, а не кортежи:
def generator(leters):
a = itertools.product(leters,repeat=3)
while a:
yield "".join(a.next())
import itertools
itertools.combinations_with_replacement(leters, 8)
Кстати, буквы имеют две буквы.
Мне было интересно, как это сделать, и это то, что я придумал, я попробовал это пару раз, но когда я написал это так, это пошло намного быстрее, чем другие... пожалуйста, lmk, если я не вижу
import string
from itertools import permutations
[print(*p,sep='')for p in permutations(list(string.ascii_letters+string.punctuation+string.digits),8)]