Возможно ли распараллелить этот цикл в python? - PullRequest
0 голосов
/ 16 октября 2018

Я работал над программой для получения радужной таблицы , используя хеш crc32.

Основной цикл программы следующий:

from zlib import crc32
from string import ascii_lowercase
from itertools import product

...

rt = {}
i = 0
for p in product(ascii_lowercase, repeat = 8):
    i += 1
    print('\n%d' % i)
    p = ''.join(p)
    print('\nCurrent password = %s' % p)
    r = bytes(p, 'utf-8')
    h = hex(crc32(r))
    for j in range(2**20):
        h = list(h)
        del h[0]
        del h[0]
        for k in range(0, len(h)):
            if (h[k].isdigit()):
                h[k] = chr(ord(h[k]) + 50)
        h = ''.join(h)
        r = bytes(h, 'utf-8')
        h = hex(crc32(r))
    h = list(h)
    del h[0]
    del h[0]
    h = ''.join(h)
    print('\nFinal hash = %s\n' % h)
    rt[p] = h
    if (i == 2**20):
        break

Итак, код работает так, как я намереваюсь, и когда он выходит из цикла, он сохраняет сгенерированную радужную таблицу (переменную rt) в памяти.Что ж, при текущем количестве итераций, показанных в приведенном выше коде, для его выполнения потребуется несколько дней, и мне нужно создать эту таблицу, а также другие таблицы с различными итерациями через циклы, чтобы выполнить некоторые тесты наих.

Я подумал, что было бы неплохо попытаться распараллелить это, но после изучения документации по многопроцессорная обработка и изучения некоторых сообщений об этом, я все ещеневозможно распараллелить его правильно.

Заранее спасибо!

1 Ответ

0 голосов
/ 17 октября 2018

Попробуйте это:

from zlib import crc32
from string import ascii_lowercase
from itertools import product
from multiprocessing.pool import Pool

def table(p):
    p = ''.join(p)
    r = bytes(p, 'ascii')
    h = hex(crc32(r))
    for j in range(2**20):
        h = list(h)
        del h[0]
        del h[0]
        for k in range(0, len(h)):
            if (h[k].isdigit()):
                h[k] = chr(ord(h[k]) + 50)
        h = ''.join(h)
        r = bytes(h, 'ascii')
        h = hex(crc32(r))
    h = list(h)
    del h[0]
    del h[0]
    h = ''.join(h)

    return (p, h)

if __name__ == "__main__":
    rt = {}
    i = 0
    with Pool(4) as pool:
        for p, h in pool.imap_unordered(table, product(ascii_lowercase, repeat = 8)):
            print('\n%d' % i)
            print('\nCurrent password = %s' % p)
            print('\nFinal hash = %s\n' % h)
            i += 1
            rt[p] = h
            if i == 2**20:
                break

Имейте в виду, что условие окончательного разрыва i == 2**20 может работать неточно из-за произвольного порядка вычислений.

...