Python实现SHA512衍生8位哈希函数碰撞查找及计时功能求助
哈希碰撞计时功能实现方案
原有代码问题
你代码中调用的time.timer(result)属于错误用法,Python标准time库没有该接口,无法完成计时统计。
修改逻辑
- 在哈希生成循环开始前,使用高精度计时器
time.perf_counter()记录启动时间戳,该接口精度远高于普通时间戳,适合短耗时场景统计 - 每次检测到碰撞时,再次读取当前时间戳,和启动时间戳做差即可得到从程序启动到发现本次碰撞的总耗时
- 可选优化:你当前仅循环10次几乎不可能触发碰撞,若使用4字节(32位)截断哈希需要约6.5万次采样才有可能出现碰撞,可按需调整循环次数,或修改为无限循环直到找到目标数量的碰撞后退出
修改后完整代码
import hashlib import os import time lookup_table = {} collision_counts = 0 # 记录程序启动时间 start_time = time.perf_counter() # 可以把range的数值改大,比如改成1000000,或者直接用while True无限循环直到碰撞 for value in range(1000000): random_binary = os.urandom(8) result = hashlib.sha512(random_binary).digest() # 如果你需要的是8位(1字节)哈希,把切片改成result[:1]即可,碰撞概率会大幅提升 result = result[:4] if result in lookup_table: # 计算当前碰撞的耗时,保留4位小数 cost_time = round(time.perf_counter() - start_time, 4) print("发现碰撞") print(f"碰撞值1:{lookup_table[result]},哈希结果:{result}") print(f"碰撞值2:{random_binary},哈希结果:{result}") print(f"本次查找耗时:{cost_time} 秒") collision_counts += 1 # 如果只需要找1次碰撞,找到后可以直接break退出循环 # break else: lookup_table[result] = random_binary print("总碰撞次数:", collision_counts)
内容的提问来源于stack exchange,提问作者NHP
相关产品推荐
相关产品推荐

