web-dev-qa-db-ja.com

重複ファイルを見つけますか?

重複ファイルを検出するプログラムを開発するつもりですが、これを行うための最良/最速の方法は何でしょうか?私はこれを行うための最良のハッシュアルゴリズムが何であるかにもっと興味がありますか?たとえば、各ファイルのコンテンツのハッシュを取得し、同じハッシュをグループ化することを考えていました。また、最大ファイルサイズを制限したり、大きなファイルに適したハッシュを設定したりする必要がありますか?

4
ub3rst4r

最も速い方法は、同じサイズのファイルのハッシュコードを比較することです。
これはこれについてのアイデアです SOに対する回答 (2番目のコマンドラインとその説明を参照)。

重複ファイルを検出する際のセキュリティ上の問題はないため、高速ハッシュコードをお勧めします。たとえば、プロジェクト ccache はMD4を使用します。

ccacheは、非常に高速な暗号化ハッシュアルゴリズムであるMD4をハッシュに使用します。 (現在、MD4は弱すぎて暗号化のコンテキストで使用することはできませんが、再コンパイルを識別するために使用するには十分安全である必要があります。)

2つのファイルのサイズとハッシュコードが同じ場合、それらはおそらく同じです。ただし、これらの2つのファイルが異なる可能性はまだあります(ファイルサイズがハッシュコードサイズよりも小さい場合を除く)。

質問にあるように、ファイルサイズが大きいほど誤検知が頻繁に発生する可能性があります。

大きなファイルの問題を修正するには、2つのオプションがあります。

  1. 大きなファイル(MD4やMD5など)には2番目のハッシュコードを使用します。
  2. 動的長のハッシュコードを使用する

2番目のチェックを必要とするのに十分な大きさのファイルと見なすための制限は、アプリケーションの重要度によって異なります。

最後に、safest続行する方法は次のとおりです。

  1. 同じサイズのファイルを検出する
  2. 同じサイズの場合=>(計算済みの)ハッシュコードを比較する
  3. 同じサイズで同じハッシュコードの場合=>コンテンツ全体を比較
7
olibre

開発者の時間を最適化している場合、あなたは正しい軌道に沿っています。まともなハッシュアルゴリズムを選択すると、衝突が発生する可能性は非常に低くなります(Yanisのリンクを参照してください。ただし、それとは別に、ハッシュにMD5またはSHA1を使用するのが一般的ですが、セキュリティを重視する場合はMD5は推奨されません)。ハッシュアルゴリズムの実装と維持は価値がないかもしれないので、プログラミング環境ですぐに利用できるものを使用します。

実行時のパフォーマンスが心配な場合は、プロセスを最適化するためにできることがいくつかあります。すべてのデータの読み込みと実際のハッシュプロセス自体の2つの領域が遅い可能性があります。アイデアを与えるために、ほとんどのハッシュアルゴリズム(より遅い暗号化アルゴリズムでも)は通常 毎秒数百MB を通過します。したがって、(非常に高速な)SSDを使用しているのでない限り、ボトルネックはディスクIOである可能性が高いため、最初にそれを最小化するようにしてください。

1つのアイデアは、最初にファイルをサイズでグループ化し、一意のサイズのファイルを除外することです。次に、残りの各ファイルの最初の数kBをハッシュし、それを使用して一致する可能性のあるリストを作成します(ここでも、まったく同じサイズのファイルとのみ比較します)。ドライブ上のすべてのファイルとは対照的に、これらの潜在的な一致の完全なハッシュを取得するだけで済みます。ドライブの正確な特性に応じて、これはmayが単にすべてを読み取るよりも高速です(非常に多数の重複があり、それらを除外するために時間を浪費している場合を除いて-最悪)ケースシナリオ)。これは、実際の環境についてより多くの知識があれば、典型的なワークロードではかなりうまく機能するはずです。

3
Daniel B