ファイルが同じかどうかをすばやく検出する方法を作成したいと思います。ほぼ100%の確実性のために、既存のハッシュアルゴリズム(SHA256など)を使用します。ただし、ファイルは数GBの巨大なビデオファイルであることが想定されているため、SHA256ハッシュの計算には、特にネットワーク上で時間がかかる場合があります。
したがって、他のさまざまな手法を組み合わせたいと思います。
- ファイルサイズ:ファイルサイズが変更された場合、コンテンツは変更されました(確か)
- 頭/尾ハッシュ
- ランダムハッシュ
後者の2つは私の質問の一部です。
私の推測では、ヘッダーには次のようなものがあります:
- フレームレート(ビデオなど)
- 解像度(ビデオ、画像など)
- (ファイル)長さ(フレーム、ピクセルなど)
- 最終変更日(例:動画ではなくWord文書)
尾をチェックすることを検討する理由は次のとおりです。
- MP3にはタグ情報があります
- EXIFが正しい場合は、最後にカスタムデータを追加します
ランダムハッシュは、ファイル内のランダムな位置にある特定の長さ(例:64 kB)の126の領域を選択し、それらのハッシュを作成します。もちろん、後で比較するためにオフセットを覚えています。全体として、ハッシュには(1 + 126 + 1)* 64 kBのデータを使用するので、ハッシュを取得するには、数GBではなく8 MBを読み取るだけで済みます。
たぶん今は数学の問題でしょうが、ファイルサイズ、ヘッド、テール、ランダムデータの組み合わせを使用して変更を検出し、このクイックハッシュサムを生成する可能性はどのくらいありますか?
ファイルは常に正当なファイルであると思います。シングルバイトを操作するメリットはありません。ユーザーは通常のビデオ編集ツールを使用してファイルを変更します。
更新:私はCrypto.StackExchangeからのこの回答を受け入れませんでした。私の提案は暗号化されておらず、安全であることを意図していないことに同意します。また、ファイルのCRC処理が高速であることにも同意しますが、私の場合は本当にハッシュが必要です。その理由を説明します。
- 私のアプリケーションでは、ブックマークをビデオに保存することが期待されています。私のデータベースは、ビデオハッシュとブックマークを保存することが期待されています。
- ユーザーがファイルを移動または名前変更することがあります。私のプログラムは、ファイルが存在しないことを認識しますが、データベースからブックマークを削除しません。代わりに、同じビデオが(誤って)再度再生されたときに、(おそらく)同じファイルであることを認識したいと思います。
- ユーザーは、ネットワークドライブ(NAS)にファイルを保存し、ビデオをストリーミングする必要があります。それらはダムストレージです。サーバーコンポーネントをインストールできません。そして、それらはかなり遅いかもしれないので、私は本当に完全なハッシュを望んでいません。3 GBファイルのフルハッシュの計算には、ハッシュアルゴリズムの速度に関係なく、10 MB /秒で少なくとも5分かかります。
- ユーザーがファイルを編集した場合、どういうわけかハッシュが一致しないことを期待します。そうしないと、間違ったブックマークが表示されてしまうからです。
正しいブックマークを取得できる可能性は約80%です。ハッシュピースをいくつまとめて、ファイルのどこに配置すればよいですか?