1

私はプログラミングの旅に出ようとしていますが、間違いなく失敗したり、Mac にマウスを投げたりすることになりますが、これは興味深い問題です。

ベースディレクトリからスキャンを開始し、各ファイルを再帰的にループダウンするアプリを構築したいと考えています。完全に重複するファイルが見つかった場合は、そのファイルを削除し、その場所にシンボリックリンクを作成します。基本的に貧乏人の重複排除。私の Mac にはたくさんの重複ファイルがあり、ディスク容量を解放する必要があるので、これは実際に私にとって本当の問題を解決します。

私が読んだことから、これは戦略です:

  1. 再帰的にループし、各ファイルのハッシュを生成します。ハッシュは非常に一意である必要があります。これが最初の問題です。どのハッシュを使用すればよいですか? この魔法のハッシュを介して各ファイルのバイナリ コンテンツ全体を実行するにはどうすればよいですか?

  2. 各ファイルのハッシュとフルパスをキー/値ストアに保存します。redis はその速度の点で非常に適していると思います。

  3. キー/値ストアを反復処理し、重複するハッシュを見つけ、重複ファイルを削除し、シンボリック リンクを作成し、キー/値ストアの行にコピーとしてフラグを立てます。

したがって、私の質問は次のとおりです。

  • 各ファイルにどのハッシュ アルゴリズムを使用すればよいですか? これはどのように行われますか?
  • ノードは一般的にI / Oタイプのもので高速であるため、node.jsの使用を考えています。問題は、ノードが CPU を集中的に使用するものを吸い込むことです。そのため、ハッシュがボトルネックになる可能性があります。
  • ここで私が見逃している他の落とし穴は何ですか?
4

2 に答える 2

4

各ファイルにどのハッシュ アルゴリズムを使用すればよいですか? これはどのように行われますか?

SHA1 を使用します。Git は SHA1 を使用して、ファイルの一意のハッシュを生成します。衝突することはほとんどありません。標準 SHA1 の既知の衝突はありません

ノードは一般的にI / Oタイプのもので高速であるため、node.jsの使用を考えています。問題は、ノードが CPU を集中的に使用するものを吸い込むことです。そのため、ハッシュがボトルネックになる可能性があります。

アプリケーションには 2 種類の操作があります。

  • ファイルの読み取り (IO バウンド)。
  • ハッシュを計算しています (CPU バウンド)。

私の提案は、ネイティブのハッシュ ライブラリがない限り、スクリプト言語 (Ruby または JavaScript) でハッシュを計算しないことです。などの他の実行可能ファイルを呼び出すことができますsha1sum。これは C で書かれており、非常に高速に動作するはずです。

NodeJS は必要ないと思います。NodeJS はイベント駆動型 IO では高速ですが、I/O 速度を向上させることはできません。ここでイベント駆動型 IO を実装する必要はないと思います。

ここで私が見逃している他の落とし穴は何ですか?

私の提案: 使い慣れた言語で実装するだけです。あまりにも早い時期にオーバーエンジニアリングしないでください。本当にパフォーマンスの問題が発生した場合にのみ最適化してください。

于 2011-11-28T04:03:07.507 に答える
0

少し遅れましたが、miaout のアドバイスを利用して、これを思いつきました...

var exec = require('child_process').exec;
exec('openssl sha1 "'+file+'"', { maxBuffer: (200*10240) }, function(p_err, p_stdout, p_stderr) {
  var myregexp = /=\s?(\w*)/g;
  var match = myregexp.exec(p_stdout);
  fileInfo.hash = "Fake hash";
  if (match != null) {
    fileInfo.hash = match[1];
  }
  next()
});

sha1sum を使用することもできますが、他のすべての優れたソフトウェアと同様に、自作のようなものをインストールする必要があります。もちろん、環境が整っていれば自分でコンパイルすることもできます。

于 2014-08-24T22:26:45.450 に答える