Skip to content

Instantly share code, notes, and snippets.

@msakamoto-sf
Last active November 1, 2022 23:40
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msakamoto-sf/a42cc2c02d780d95a6af5413a739ded1 to your computer and use it in GitHub Desktop.
Save msakamoto-sf/a42cc2c02d780d95a6af5413a739ded1 to your computer and use it in GitHub Desktop.
diff(差分検出アルゴリズム)のJavaライブラリが無いか探したので、参考URLの調査メモ。

diff(差分検出アルゴリズム)のJava実装調査メモ

diff(差分検出アルゴリズム)のJavaライブラリが無いか探したので、参考URLの調査メモ。

※URLなどは2018-01-04時点のもの。

アルゴリズムの種類

diffツールでのアルゴリズムについては、ざっくりと以下のWiki参照:

Myerのアルゴリズム系

正確には複数の論文で改良が加えられていったアルゴリズムだが、Java実装のドキュメントでよく "Myer's diff" と参照されているので「Myerのアルゴリズム系」と総括した。

参考記事:

patience, histogramアルゴリズム

git-diff で実装され、JGitでも使われている。ソースコードの差分比較で、より人間が見やすい形で差分をまとめてくれる。 ちなみに "patience" とは「根気」。

Java実装

java-diff-utils

軽くぐぐったところ、Google Codeのオリジナル版からGitHubにforkしたものや、独自実装でたまたまリポジトリ名が同じになったものなど複数あった。

Google Code のオリジナル版:

GitHubでのfork:

ライセンスについてはいずれもAPL 2.0が維持されている。

google-diff-match-patch

Googleが実装した複数言語向けのdiff/patchライブラリ。

Google Code のオリジナル版:

GitHubでのfork:

他にもGitHubでのforkはあるが、他の言語実装が抜き出されてforkされたものも複数あり、全部は見きれなかった。 Java実装で一番スターを集めていたのが上記リポジトリで、今回はそれのみチェックして終わりとした。

日本語参考記事:

diff4j

Hudson(現Jenkins)のリードエンジニアである川口耕介氏が開発した差分ライブラリ。 実装コードをざっと眺めた所、テキストファイルを行単位で比較していくコードと、外部のdiffコマンドを呼び出すコードがdiff差分処理の中核となっている。 (逆に言えば、diffアルゴリズムの具体的なサポート状況は不明)

※元Sunのエンジニアだった川口耕介氏は2010年4月Oracleを退社してInfraDNAを興しており、InfraDNAは2010年11月にCloudBeesに買収されている。

JGit

Eclipseで開発されている、Pure JavaでのGit実装。この中にGitで使うdiff実装が含まれている。 EclipseのGitプラグインであるEGitは、JGitのEclipse向けフロントエンドとなっている。

感想

  • 複数のJava実装があり、どれを選択するのか悩みそう。
  • 個人的には自分でテストコード書くなりして、実際に動かして比べてみるのが良さそう。
  • それをする時間も無いなら、 多分 利用者が多くて広く使われているだろうから、JGitを選択するのが良さそう。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment