是否可以在 python 中并行化此循环?
Is it possible to parallelize this loop in python?
我一直在开发一个程序来获得 rainbow table,使用 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
因此,代码按照我的预期运行,当它退出循环时,它将生成的彩虹 table(变量 rt)存储到内存中。好吧,根据上面代码中显示的当前迭代次数,完成它的执行需要几天时间,我需要创建这个 table,以及其他通过循环进行不同迭代的,以便对它们做一些测试。
我认为尝试并行化它是个好主意,但是在阅读了 multiprocessing 上的文档并潜伏在一些关于它的帖子之后,我仍然无法在正确的方法。
提前致谢!
试试这个:
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
可能无法准确工作。
我一直在开发一个程序来获得 rainbow table,使用 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
因此,代码按照我的预期运行,当它退出循环时,它将生成的彩虹 table(变量 rt)存储到内存中。好吧,根据上面代码中显示的当前迭代次数,完成它的执行需要几天时间,我需要创建这个 table,以及其他通过循环进行不同迭代的,以便对它们做一些测试。
我认为尝试并行化它是个好主意,但是在阅读了 multiprocessing 上的文档并潜伏在一些关于它的帖子之后,我仍然无法在正确的方法。
提前致谢!
试试这个:
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
可能无法准确工作。