# F2 无对象快照解析

本页保留 F2 API 的约定。F3 新增 [parse_strings](strings.md)，原 `parse_empty` 仍拒绝对象及 AUX LZF，行为未扩大。

## 接口与成功含义

`parse_empty(input, max_input_bytes=64 MiB, max_string_bytes=1 MiB, max_metadata_entries=4096)` 返回 `EmptySnapshot`，异常为 `ParseError`。参数的实际签名以 `pkg.generated.mbti` 为准。

只有格式版本 11、全部支持的文件结构读完、EOF 后的八字节校验区存在、没有尾随字节，并且非零校验和匹配时，才返回成功。全零校验区是 `Disabled`，表示文件按格式声明不校验；不会被报告为 `Valid`。该入口不接受键值对象、函数、模块及 AUX LZF 字符串，遇到不支持项立即返回带原始偏移的错误，不尝试猜长度跳过。

返回内容：

- `format_version`、`file_size`：文件格式版本和输入字节数。
- `aux_fields`：输入顺序的原始二进制键值；重复字段保留，未知字段不解释。普通字符串保持字节，整数编码字符串转为有符号十进制字节。
- `database_selections`：显式 SELECTDB 的顺序列表，重复选择保留。没有 SELECTDB 时为空；不能据此推断实例只配置了零个数据库。
- `resize_hints`：RESIZEDB 的数据库编号、键数和到期键数提示，默认作用于数据库 0。只记录数值，不按其分配表或当作实际统计；因此提示值可大于实际对象数。
- `checksum`：`Valid(stored)` 或 `Disabled`；计算失败抛出 `ChecksumMismatch(stored, computed)`。

## CRC64

参考固定 Redis 提交中的 [crc64.c](https://github.com/redis/redis/blob/f60370ce28b946c1146dcea77c9c399d39601aaa/src/crc64.c)。按多项式参数独立实现位运算版本，未复制或翻译上游函数体。正向多项式为 `0xad93d23594c935a9`，本实现使用其反射形式 `0x95ac9329ac4bc9b5`，初始值与最终异或均为零。公开校验向量 `123456789` 对应 `e9c6d914c4b8d9ca`。

校验范围从文件头到 EOF 操作码（包含 EOF），不含之后的小端八字节校验区。真实 Redis 7.2.5 样本及公开向量均通过。修改真实样本任一字节的最低位都被拒绝；结构仍合法的 AUX 内容修改以及校验区修改会触发校验不匹配。CRC64 用于损坏检查，不是密码学认证。关闭校验和的文件只验证结构，内容被修改但仍符合结构时不保证检出。

## 键前置元信息

内部读取器可解码 EXPIRETIME_MS、旧 EXPIRETIME、IDLE 与 FREQ，为 F3 对象读取准备。毫秒到期时间保持 Int64；旧秒值按有符号小端 32 位读取，先扩展到 Int64 再乘 1000。旧秒字段的历史实现依赖主机字节序，这里只承诺小端表示，不承诺旧版本跨端序兼容。IDLE 保留 UInt64 秒数，FREQ 保留原始单字节计数，不解释为精确访问次数。不读取当前时钟，不过滤已过期数据。

重复到期字段、重复 IDLE 或重复 FREQ 被拒绝；这是本项目的严格输入规则，不声称复制上游对所有异常组合的容错行为。元信息必须紧跟对象类型，不能落在 EOF、AUX 或数据库切换之前。缺少对象的前缀返回 `DanglingKeyMetadata`。F2 尚不解码对象，因此合法前缀后跟对象仍返回 `UnsupportedObjectType`，不会产生成功的键记录。

## 资源与失败边界

输入仍由调用方一次性提供。`max_input_bytes` 约束整个输入，`max_string_bytes` 分别约束 AUX 的键和值（整数也按最终十进制字节数检查），`max_metadata_entries` 合计约束保留的 AUX、SELECTDB 和 RESIZEDB 条目。负数限制明确失败，零允许对应内容为空。普通字符串先比较 UInt64 长度与限制，再读取和复制；不会把极大长度截成小数。限制不撤销调用方已经分配的输入。

没有部分成功返回值或输出文件。未知操作码、未知编码、截断、过量资源和校验失败均抛出错误。错误优先级由读取顺序决定：不支持的内容可能在到达校验区之前失败；EOF 后若有尾随字节会先报告 `TrailingData`。基本读取仍保持失败原子性；前置元信息复合读取失败时恢复到调用入口（首操作码已由调度器读取）。

## 验证证据

F2 交付时的 42 项测试包含原 F1 的 20 项，并新增 22 项，F3 中全部保留。原有真实空库验证 AUX 与 CRC64；真实关闭校验和空库验证 `Disabled`。两份样本均由隔离的第三方 Windows Redis 7.2.5 构建生成，来源详见 [样本说明](../fixtures/README.md)。

数据库切换、RESIZEDB、大数提示、二进制与整数 AUX、到期／空闲／频率字段、重复和孤立元信息、未知操作码及资源限制使用明确标记的合成输入。真实空库不会包含数据库切换和键元信息，本阶段没有真实有键快照的对象级验收，也没有性能或大文件内存测量。
