Python海量数据遍历优化:SHA512哈希字典攻击效率提升咨询
核心优化说明
你当前代码慢的核心原因不是数据结构选择问题,而是存在大量无意义的重复操作、高开销的IO操作,没有利用Python执行特性和硬件性能,具体优化点如下:
- 第一,删除循环内的
print(big_word)语句:控制台IO是极慢的操作,这是你当前速度慢的头号元凶,删除后性能可以提升几十到上百倍。 - 第二,提前预处理单词列表:读入字典时就完成
strip()操作,不要在双层循环中重复对同一个单词执行多次strip,减少无意义的重复计算。 - 第三,减少不必要的函数调用和字符串比对:将哈希校验逻辑直接内联到循环中,避免高频函数调用开销;同时提前把目标哈希转成字节格式,直接比对二进制哈希值而非十六进制字符串,比对速度可以提升一倍左右。
- 第四,提前拼接第一个单词加空格的前缀,减少内层循环的字符串拼接操作,进一步降低重复计算开销。
- 第五,找到匹配结果后直接终止全部循环,避免多余的计算。
- 额外可选优化:如果有多核CPU,可以用多进程拆分计算任务,CPU密集型场景下可以做到核数倍的性能提升;也可以用PyPy替代CPython执行代码,PyPy对循环运算的优化比CPython好很多,这类纯计算场景可以再提速3-5倍。
优化后代码
import hashlib import sys import time if __name__ == "__main__": target_hash = sys.argv[1].strip() # 提前把目标哈希转成二进制,避免每次比对字符串 target_digest = bytes.fromhex(target_hash) # 读字典的时候直接预处理好strip后的单词 with open("02-dictionary.txt", "r", encoding="utf-8") as fp: words = [word.strip() for word in fp] start_time = time.time() found = False result = "" for word1 in words: # 提前拼接好第一个单词加空格的前缀,减少内层循环的拼接操作 prefix = word1 + " " for word2 in words: candidate = prefix + word2 # 直接内联哈希计算,避免函数调用开销 if hashlib.sha512(candidate.encode()).digest() == target_digest: found = True result = candidate break if found: break end_time = time.time() if found: print('Solution found') print("The word was:", result) else: print("No solution found") print("Time taken:", round(end_time - start_time, 5), "seconds")
内容的提问来源于stack exchange,提问作者Will Trussell
相关产品推荐
相关产品推荐

