You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何中断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:49:25