6 个版本
0.0.7 | 2020 年 6 月 8 日 |
---|---|
0.0.5 | 2020 年 6 月 2 日 |
0.0.4 | 2020 年 5 月 31 日 |
#3 in #block-hash
35KB
788 行
PATCHY
Patchy 是一个用于创建和应用二进制文件补丁的命令行工具。
注意:序列化格式向后兼容性将不会在第一个主版本 1.0.0
之前得到维护。
工作原理
一般算法类似于 rsync
。工具在两个文件上操作:本地 base(旧)和 other(新)。other 文件被分成等大小的块,并为每个块计算一对哈希值:使用类似于 adler-32
的滚动校验和的 32 位弱哈希,以及使用 blake3
的 128 位强哈希。然后逐字节扫描 base 文件,维护块大小的滚动哈希窗口。如果当前窗口的滚动哈希与之前为 other 文件计算的某些块弱哈希匹配,则为此窗口计算强哈希并与之比较 other 文件的强块哈希。此过程找到 base 文件中可以用于将其修补以生成 other 文件的块。最后,生成一个补丁命令列表,该列表告诉哪些块需要从 base 和 other 文件复制(作为源/目标字节偏移和大小)。缺失于 base 的块以及复制命令写入补丁文件,然后使用 zstd
进行压缩。
一旦生成补丁,就可以通过执行复制命令来简单地应用它,从 base 文件或从补丁本身读取数据并将其写入输出文件(该文件必须不同于 base,因为就地修补尚未实现)。
Patchy 在生成过程中对补丁进行基本验证,通过将补丁应用到内存中的 base 文件并比较其哈希值与新文件的哈希值来实现。稍后从文件应用补丁时,将检查 base 文件和修补输出文件的哈希值与存储在补丁元数据中的值是否匹配。
用法
diff
patchy diff[选项] <BASE> <OTHER> [PATCH]
计算由 BASE
和 OTHER
指定的文件之间的差异,并可选地生成 PATCH
文件,该文件可以用于稍后将其转换为 OTHER
。
如果未指定 PATCH
,则补丁仍然在内存中生成和验证,但不会写入磁盘。
选项
-b<块>
- 补丁块搜索窗口作为 log2(字节)
- 预期范围:[6..24]
- 默认:11 (2048字节)
-l<级别>
- 压缩级别
- 预期范围:[1..22]
- 默认:15
patch
patchy补丁<BASE> <PATCH> [输出]
应用之前使用 diff
命令在指定文件 BASE
上生成的补丁,可选地将结果写入到 OUTPUT
。
如果未指定 OUTPUT
,则修补过程仍然在内存中执行和验证,但不会写入磁盘。
未来工作
自动块大小
块大小选择对于最小化补丁大小非常重要。较小的块可以产生更小的二进制差异blob,但会以大幅增加的修补命令列表为代价。可能有一种方法可以自动找到给定数据集的最佳块大小。
优化的补丁命令列表编码
命令列表目前简单地以原始数组的形式写入为 {u64, u64, u32}
结构体。一个简单的优化步骤运行在这个列表上以合并相邻的复制命令,但很可能通过更智能的命令编码(可变大小的命令、基于delta的偏移和大小等)可以实现显著的尺寸缩减。
整个目录模式
当前版本的工具仅对单个文件进行操作。虽然可以将目录 tar
以生成补丁,但原生目录修补支持会更好。
依赖项
~8.5MB
~163K SLoC