← 中文资源

简体中文版本

构建二进制差异补丁工具

一个二进制差异工具:以滚动哈希计算两段字节序列间的紧凑补丁,并在应用时无需源即可重建目标。

阅读英文原文

项目概述

本项目实现二进制差异补丁工具:将源按固定块切分并以滚动哈希索引,扫描目标时以同一哈希匹配,命中则验证整块后发出引用源偏移的复制操作码,未命中则累积为插入操作码。滚动哈希使扫描每步 O(1) 更新。应用端仅需补丁与源即可重放操作码重建目标,尾部校验和检测截断或篡改。测试构造共享长块的目标断言补丁远小于目标;不相关输入退化为单次插入;逐字节插入使所有块移位仍断言正确;截断补丁断言抛错;哈希碰撞断言整块验证后不发出错误复制;自差断言为单次整源复制。块大小按变更粒度选择而非默认;补丁格式自描述可流式读写。固定块大小无法应对整体移位;无差中之差;滚动哈希非密码学,完整性依赖尾部校验和。

架构与实施

构建二进制差异补丁工具的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建二进制差异补丁工具实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:crypto版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
binary-diff-patcher/
├── src/diff.ts
├── src/apply.ts
├── src/rolling-hash.ts
├── tests/diff.test.ts
└── package.json
for (let i=0; i+BLK <= src.length; i+=BLK) index.set(hash(src,i), i);
if (index.has(h)) emitCopy(index.get(h), BLK); else literals.push(target[i]);
for (const op of patch) out.push(op.type==="copy" ? src.slice(op.off, op.off+op.len) : op.bytes);
patch.checksum = sha256(target.length + ":" + ops.length);
pnpm vitest run