Как я могу перебирать комбинации всех символов быстрее? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть простая функция, которая перебирает комбинации всех символов, используя itertools. Я рассчитал, что для строки из 4 символов требуется 94 сек. Но для 7 это уже занимает ~ 3600 часов или 157 дней. Я пытался использовать джит Numba с и без Cuda, и это не сработало, так как itertools не совместим с Numba. Я также попробовал Threading, но это не сработало. Я сделал это:

def test(j):
    pass

def start():
    start_time = time.time()
    for i in range(2, 3):
        for j in map(''.join, itertools.product(myLetters, repeat = i)):
            t = Thread(target = test, args = j)
            t.start() 

Но это просто спамит меня "Исключением в ThreadN Исключением в ThreadN и т. Д. c. Может кто-нибудь помочь мне заставить этот код работать быстрее? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Это даст вам все комбинации (в разговорной речи), не сохраняя их в памяти сразу:

import itertools

def get_next_combination(iterable):
    for i in range(1, len(iterable)+1):
        yield from map("".join, itertools.product(iterable, repeat=i))


for combination in get_next_combination("abc"):
    print(combination)
    # if hash_algorithm(combination) == known_hash: print("Password found!")

Вывод:

a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc

Может обрабатывать 7 строк символов в ~ 3 секунд, не беспокойтесь.

Если вы на самом деле пытаетесь взломать пароль, я бы предложил просто использовать hashcat или хотя бы выполнить атаку по словарю с огромным списком известных паролей.

Использование нескольких потоков может на самом деле не ускорить процесс, потому что [эталонная реализация] Python будет одновременно выполнять только один Python байт-код. Хотя я полагаю, что itertools написано в C, поэтому оно, вероятно, выпускает GIL. Тем не менее, вам обычно нужно использовать multiprocessing для улучшения программ Python, связанных с процессором.

0 голосов
/ 27 апреля 2020

Это то, что вы пытаетесь сделать? Этот код переставляет символы строки для всех перестановок. Для 7 символов это в основном мгновенно.

import itertools

word = '1234567'
word = list(word)

# Create all permutation of numbers that will be the indeces of the characters
all_permutations = list(itertools.permutations(range(len(word))))

# For each permutation create a string that has each of its characters repositioned to new index
for permutation in all_permutations:
    new_word = ''.join([word[i] for i in permutation])
    print(f'new_word = {new_word}')
...