メインコンテンツへ移動

テキスト差分比較

Diffチェッカーは、Myers差分アルゴリズムをブラウザ内で直接実行する、高速なクライアントサイドのテキスト比較エンジンです。行・単語・文字の各単位での比較、unified表示とサイドバイサイド表示、空白と大文字小文字の正規化の切り替え、外部へのネットワーク送信ゼロでのunified diffパッチの即時生成に対応しています。

端末内で処理
元のテキスト(ベース)
0 B1 行行 1、列 1
変更後のテキスト
0 B1 行行 1、列 1
集計:+0 追加-0 削除1 変更なし
1
1

テキスト差分比較はどう動きますか?

ToolsByUsのテキスト差分エンジンは、Eugene W. Myersの画期的な論文「An O(ND) Difference Algorithm and Its Variations」に基づいています。このアルゴリズムは、最短編集スクリプト(SES)を求める問題を、座標(0, 0)から(N, M)に広がる編集グラフ上の最短経路探索として定式化します。

各編集距離Dについて、斜めの経路k = x - yに沿って最遠到達点を追跡することで、Myers差分は、元のテキストを対象のテキストへ変換するのに必要な挿入と削除の最小回数を見つけ出します。単語レベルで適用した場合、エンジンは変更された行に対して2次差分を行い、行の中の単語単位の削除と挿入を正確に切り分けます。

ソースファイル、社外秘の設定、機密のログをリモートのデータベースへ送ってしまうサーバーサイドのツールとは違い、ToolsByUsはMyersの編集マトリクス全体を、ブラウザのメモリ内でローカルに直接実行します。

変更前と変更後のサンプル

// Original:
const port = 8080;

// Modified:
const port = 3000;

出力例

// Unified Diff:
@@ -1,1 +1,1 @@
-const port = 8080;
+const port = 3000;

変更前と変更後のサンプル → 出力例

変更前と変更後のサンプル

server:
  host: localhost
  port: 8080
  timeout: 30

変更前と変更後のサンプル 2

server:
  host: 0.0.0.0
  port: 8080
  timeout: 60
  retries: 3

出力例

--- a/original
+++ b/modified
@@ -1,4 +1,5 @@
 server:
-  host: localhost
+  host: 0.0.0.0
   port: 8080
-  timeout: 30
+  timeout: 60
+  retries: 3

テキスト差分比較が対応するオプションとエッジケースは?

技術リファレンスとオプション
パラメータ型デフォルト動作とエッジケース
粒度:行モードデフォルトテキストを改行で分割します。コード、設定、スクリプトに最適な高速なO(ND)実行です。
粒度:単語モード任意行を単語トークンに分割します。変更された行では単語単位の挿入と削除がハイライトされます。
粒度:文字モード任意文字列を個々の文字単位に分割します。タイポ、ハッシュ、Base64文字列を特定します。
空白を無視切り替えfalse連続するスペースとタブを正規化し、インデント調整による変更が発生しないようにします。
大文字小文字を無視切り替えfalse大文字小文字を区別せずにテキストを比較します。SQLクエリ、HTTPヘッダー、HTMLタグに便利です。
Unified Diffエクスポート形式標準git apply、patch(1)、レビューツールと互換性のある標準のunified diff形式で出力します。

よくある質問

Myers差分アルゴリズムはどのように動作しますか?

Myers差分アルゴリズムは、列Aを列Bへ変換するための追加と削除の最短手順を見つけます。編集グリッド上の斜めの経路を探索することで動作し、差分出力が数学的に最小であることを保証します。

unified diffパッチファイルを書き出せますか?

はい。「unifiedパッチをエクスポート」をクリックすると、'---'と'+++'のヘッダー、'@@ -start,len +start,len @@'のhunk範囲を持つ標準的なunifiedパッチ文書が生成されます。コピーも、標準のUNIX patchやgit applyユーティリティへの入力もそのまま行えます。

単語レベルの差分はコードレビューにどう役立ちますか?

通常の行単位の差分は、1文字や変数名が変わっただけでも行全体をハイライトします。このツールの単語レベル差分エンジンは、変更された行をトークンごとに比較し、その行の中で実際に変わったトークンだけをハイライトします。

ドキュメントがサーバーに保存されたりキャッシュされたりしますか?

いいえ。ToolsByUsにはバックエンドサーバーもデータベースもありません。すべての差分計算は厳密にブラウザ内で実行されます。ファイル、ログ、テキストがアップロードされることは一切ありません。

行・単語・文字の各差分の違いは何ですか?

行単位の差分は、行内の1文字でも違えば行全体を「変更」として扱います。散文にはそれで正しくても、変数を1つリネームしただけのコードの行には不適切です。単語モードは変更された行の中のトークンを比較します。文字モードはさらに1文字まで掘り下げます。識別子の中の打ち間違いや設定値に入り込んだ余分な空白を見つけられるのは、このモードです。

非公開リポジトリの機密コードをここで比較できますか?

はい。しかも「信頼する」のではなく「確かめる」ことができます。比較はこのタブ内で実行されます。DevToolsを開いてNetworkパネルに切り替え、貼り付けて比較しても、テキストを運ぶリクエストは一切出ません。このページはconnect-src 'self'というContent-Security-Policy付きで配信されているため、外向きのリクエストはブラウザ自身が拒否します。ページを読み込んだ後は、ネットワークを完全に切った状態でも動作します。