如何在Python中结合多进程高效暴力破解5位字符SHA256哈希?
解决5位字符SHA256多进程暴力破解的生成器优化方案
核心问题拆解
Pool.map会一次性把所有字符组合加载到内存,5位字符的组合数(比如大小写字母+数字的话是62^5≈9亿)直接撑爆内存,导致系统崩溃。Pool.imap默认按单任务分发,进程间频繁的通信开销完全抵消了多进程的优势,所以比单进程还慢。- 单进程没有跨进程通信的额外消耗,还能高效利用CPU缓存,因此耗时更短。
具体优化方案
1. 手动控制任务分块(关键)
用Pool.imap_unordered或Pool.imap时,指定合理的chunk size,大幅减少进程间通信的次数。分块大小可以根据CPU核心数调整,比如固定为100000~200000(可根据机器性能微调),或者按公式估算:chunk_size = 总任务数 // (CPU核心数 * 4)。
示例代码:
import multiprocessing import hashlib from itertools import product TARGET_HASH = "你的目标SHA256哈希值" CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" def crack_worker(chunk): for chars in chunk: plaintext = ''.join(chars) if hashlib.sha256(plaintext.encode()).hexdigest() == TARGET_HASH: return plaintext return None if __name__ == "__main__": # 不要盲目用满超线程,CPU密集型任务用物理核心数更高效 process_num = multiprocessing.cpu_count() // 2 combinations = product(CHARSET, repeat=5) chunk_size = 100000 # 可根据机器性能调整 with multiprocessing.Pool(process_num) as pool: # 用imap_unordered,找到结果就立即返回,不用等所有任务完成 for result in pool.imap_unordered(crack_worker, (tuple(combinations) for _ in iter(lambda: None, None)), chunksize=chunk_size): if result is not None: print(f"找到明文:{result}") pool.terminate() # 找到结果直接终止所有进程 break
2. 避免直接传递超大生成器
不要把product生成器直接丢给进程池,而是手动拆分生成器为多个子块,每个块包含N个字符组合,再交给进程处理。这样既不会一次性加载所有数据到内存,又能降低通信频率。
3. 优先用imap_unordered而非imap
暴力破解只要找到第一个匹配结果就行,imap_unordered会在任意进程完成任务后立刻返回结果,不用按顺序等待,能更快终止整个任务流程。
4. 合理限制进程数量
如果你的CPU支持超线程,比如8核心16线程,建议用8个进程而非16个——SHA256是纯CPU密集型任务,超线程会带来额外的上下文切换开销,反而拖慢速度。
为什么优化后多进程会比单进程快?
当进程间通信的开销被控制在最低时,多进程就能真正发挥多核CPU的并行计算优势。比如4核心机器,优化后耗时通常能降到单进程的1/3~1/4左右,远快于单进程的1分33秒。
内容的提问来源于stack exchange,提问作者Thanh
相关产品推荐
相关产品推荐

