如何中断8位十六进制字符全排列生成任务并从断点续跑?
如何中断8位十六进制排列生成任务并断点续行?
当然可以实现断点续行!你的现有代码最大的问题是没有记录执行进度,一旦中断就只能从头开始。另外还有个小细节要注意:f.close后面少了括号,应该写成f.close(),而且每次循环都打开、关闭文件会严重拖慢效率,建议改成在循环外一次性打开文件。
下面是具体的解决方案,核心思路是把每个8位十六进制组合转换成一个唯一的整数,通过记录这个整数的进度来实现断点续行:
实现步骤
- 首先,把十六进制字符集映射成索引(比如
0-9a-f对应0-15),这样每个8位组合都能转换成一个范围在0到16^8 - 1(也就是4294967295)的整数。 - 用一个单独的小文件(比如
progress.txt)来保存已经处理完成的最后一个整数,每次启动脚本时先读取这个文件的内容,确定从哪个位置开始。 - 从起始位置开始,把整数反向转换成对应的8位十六进制组合,写入结果文件,同时更新进度文件(确保进度不丢失)。
优化后的代码
import itertools # 定义十六进制字符集(根据你的需求调整大小写) hexes = '0123456789abcdef' hex_length = 8 total_combinations = len(hexes) ** hex_length progress_file = 'progress.txt' output_file = 'test.txt' def get_start_number(): """读取进度文件,获取起始数字,文件不存在则返回0""" try: with open(progress_file, 'r') as f: num = int(f.read().strip()) # 确保数字在合法范围内 return max(0, min(num, total_combinations - 1)) except (FileNotFoundError, ValueError): return 0 def number_to_hex(num): """把整数转换成8位十六进制字符串,不足补前导0""" hex_str = hex(num)[2:] # 去掉0x前缀 return hex_str.zfill(hex_length) def update_progress(num): """更新进度文件""" with open(progress_file, 'w') as f: f.write(str(num)) # 获取起始位置 start_num = get_start_number() # 打开输出文件(追加模式) with open(output_file, 'a') as out_f: for num in range(start_num, total_combinations): hex_str = number_to_hex(num) out_f.write(hex_str + '\n') out_f.flush() # 强制写入磁盘,避免缓存丢失 update_progress(num) print(hex_str)
注意事项
- 中断任务时直接终止脚本即可,进度会自动保存在
progress.txt里,下次运行脚本会从上次中断的位置继续。 - 如果需要重新从头开始,只需要删除
progress.txt文件就行。 - 相比你原来用
itertools.product的方式,这种整数转换的方法更方便记录进度,而且效率也更高(避免了生成器无法持久化的问题)。 - 如果你需要大写的十六进制字符,只需要把
hexes改成'0123456789ABCDEF',同时number_to_hex里可以用hex(num)[2:].upper()。
内容的提问来源于stack exchange,提问作者user8772750
相关产品推荐
相关产品推荐

