diff 算法的工作原理
本页面上的每个差异视图都由 Myers 算法生成 — 这是 Eugene W. Myers 于 1986 年提出的一种技术,可在 O((N+M)D) 时间内找到两个令牌序列之间的最短编辑脚本,其中 D 为编辑距离。该算法基于最长公共子序列问题,引擎使用开源 jsdiff 库完全在您的浏览器中运行。
- 对输入进行分词 — 比较前,算法将每个输入拆分为令牌序列。行粒度按换行符分割;词粒度按空白字符和标点边界分割;字符粒度将每个 Unicode 码点视为独立令牌。
- 构建编辑图 — Myers 算法将比较建模为一条穿过二维网格的路径,其中向右表示「从原始文本删除」,向下表示「从修改文本插入」,对角线移动表示「两者中的令牌匹配」。算法寻找对角线移动最多的最短路径。
- 提取 LCS — 最短路径中的对角线移动追踪出最长公共子序列 — 以相同相对顺序出现在两个输入中的令牌。LCS 中的每个令牌为「未变」;其余均为新增或删除。
- 应用预处理选项 — 启用「忽略大小写」时,两个输入在 LCS 计算前均转换为小写,使「HELLO」和「hello」被视为相同。「忽略空白字符」将多个空格折叠为一个。「修剪每行首尾空格」在比较前去除每行的首尾空白字符。
- 渲染所选视图 — 输出是同一 LCS 结果的三种展示形式:并排视图在两列网格中左侧显示原始文本、右侧显示修改文本,并以红色和绿色高亮行。统一视图显示单列,以 − 和 + 前缀行呈现,类似
git diff的输出。内联视图在同一文本流中将删除内容显示为红色删除线,新增内容显示为绿色下划线。 - 计算摘要栏 — 渲染后,工具统计新增、删除和未变的令牌数量,然后将相似度计算为未变令牌数与两个输入中较长者的令牌总数之比。相似度 100% 表示经预处理后输入完全相同。
为什么使用差异比对器
- 无需 Git 客户端的代码审查 — 粘贴配置文件、SQL 迁移脚本或 shell 脚本的两个版本,无需克隆仓库、切换分支或等待 CI 流水线,即可查看变更内容。该工具在结对编程的快速审查、外包方未共享 Git 历史的交接中,以及对完全没有版本控制的遗留代码库均非常实用。统一视图产生的输出可以直接复制粘贴到聊天线程或工单中。
- 合同和文件修改追踪 — 词级差异比较合同草稿之间的术语变化,比 Word 的修订追踪面板更快。粘贴第一稿中的某条款和已执行版本中的对应条款,具体修改的短语会以红绿色精确高亮显示。律师助理和采购团队用此方法在合同签署前核实临时修改是否通过了审查。
- 文章和草稿修订 — 将初稿与编辑版本进行比较的写作者,可切换到词粒度查看每一处替换、插入和删减,无需重新阅读两份副本。同样的工作流程适用于审核对照原文修改的译者、核查文字编辑是否保留了作者风格的编辑,以及核对已发布文章与原始稿件的新闻团队。
- 日志和配置比较 — 比较两个服务器配置快照、两个 cron 调度或两个
ps aux输出的系统管理员,可使用行粒度在几秒内定位 200 行文件中的单一参数变化。配合「忽略空白字符」选项,嘈杂的纯对齐差异可折叠为真正有意义的参数变化。
常见应用场景
文本差异比对出现在写作、开发和运维工作中每个编辑周期的末尾。
- Pull Request 审查:并排粘贴两个函数实现以理解逻辑变更,无需签出分支即可批准,省去额外开销。
- 国际化质量保证:在词级别将英文源字符串与其译文进行比对,检测译者可能引入的插入、遗漏或术语替换。
- 故障分析:在行级别对比两个 Kubernetes 清单快照或两个「docker inspect」输出,以隔离导致故障的配置变更。
实际案例
以一个五行服务器配置为例。原始:host=localhost、port=5432、dbname=app_db、user=app、password=secret。修改后:host=db.prod.example.com、port=5432、dbname=app_db、user=app_prod、password=secret。使用行粒度和并排视图,第 1 行左侧显示红色(host=localhost)、右侧显示绿色(host=db.prod.example.com),第 4 行显示红色(user=app)和绿色(user=app_prod),第 2、3、5 行在两侧均保持不变。摘要栏报告新增 2 行、删除 2 行、未变 3 行,相似度 60% — 五行中保留了三行。切换到词粒度,差异进一步收窄:只有第 1 行和第 4 行 = 右侧的值高亮显示,键名保持不变,相似度提升至约 85%,因为 LCS 现在将 host、user 以及周围的标点视为保留内容。
这在浏览器中运行吗?
是的。全部差异计算通过与页面一起加载的开源 jsdiff 库在客户端运行。您输入、粘贴或比较的任何内容都不会发送到任何服务器。您可以自行验证:打开浏览器 DevTools,切换到 Network 标签,清除日志,点击比较,确认比较步骤不触发任何网络请求。
相似度百分比是什么意思?
相似度计算公式为 未变令牌数 / max(原始文本总令牌数,修改文本总令牌数)。100% 表示两个输入在应用预处理选项(大小写折叠、空白字符折叠、行修剪)后完全相同。0% 表示两个输入之间没有任何共同令牌。该指标是编辑距离的粗略近似值,可作为快速参考 — 而非抄袭或原创性评分。
我可以对 JSON / YAML / XML 进行语义差异比较吗?
本工具不支持语义差异比较。这是文本级差异,因此 JSON 或 XML 的仅空白字符格式调整仍会显示大量变化,即使数据逻辑上完全相同。JSON 中对象键的重新排序也会显示为变化,尽管大多数解析器认为键顺序无关紧要。对于比较解析后的对象树并忽略键顺序和格式的真正语义差异比较,我们正在计划专用的 JSON Diff 工具。目前,请在粘贴前将两个输入规范化为相同的缩进和键顺序。
统一视图和并排视图有什么区别?
并排视图渲染两列:左侧为原始文本,右侧为修改文本;左侧删除行以红色高亮,右侧新增行以绿色高亮;未变行在两列的同一行对齐显示。统一视图渲染单列,删除行带 − 前缀和红色背景,新增行带 + 前缀和绿色背景 — 与终端中 git diff 的输出布局相同。当您想将结果复制为补丁文件或粘贴到代码审查线程时,使用统一视图。当替换关系的视觉对齐比原始补丁文本更重要时,使用并排视图。
将原始版本粘贴到左侧,修改版本粘贴到右侧,选择视图和粒度,比较结果在毫秒内呈现。开启实时模式,差异会在您编辑任意一侧时实时重新计算。将结果下载为标准统一 .patch 文件,可直接由 git apply 使用。无上传,无账户,无供应商 API 密钥,无配额限制。