たとえば、サイズが数十ギガバイトの大きなファイルのハッシュのパフォーマンスを向上させたいと考えています。
通常、ハッシュ関数を使用してファイルのバイトを順次ハッシュします (たとえば、SHA-256 などです。ただし、Skein を使用する可能性が最も高いため、[高速] SSD)。これを方法 1 としましょう。
アイデアは、ファイルの複数の 1 MB ブロックを 8 つの CPU で並列にハッシュし、連結されたハッシュを単一の最終ハッシュにハッシュすることです。これを方法 2 としましょう。
この方法を示す図は次のとおりです。
このアイデアが正しいかどうか、およびファイル全体のスパンで単一のハッシュを実行する場合と比較して、(衝突の可能性が高いという点で) どの程度の「セキュリティ」が失われるかを知りたいです。
例えば:
SHA-2 の SHA-256 バリアントを使用して、ファイル サイズを 2^34=34,359,738,368 バイトに設定します。したがって、単純なシングル パス (方法 1) を使用すると、ファイル全体の 256 ビット ハッシュを取得できます。
これを次のものと比較してください。
並列ハッシュ (つまり、方法 2) を使用して、ファイルを 1 MB の 32,768 ブロックに分割し、SHA-256 を使用してこれらのブロックを 256 ビット (32 バイト) の 32,768 ハッシュにハッシュし、ハッシュを連結して、結果として連結された 1,048,576 バイトのデータ セットが、ファイル全体の最終的な 256 ビット ハッシュを取得します。
方法 2 は方法 1 よりも安全性が低くなりますか? おそらく、この質問を次のように言い換える必要があります: 方法 2 を使用すると、攻撃者が元のファイルと同じハッシュ値にハッシュするファイルを作成しやすくなりますか?ハッシュは N 個の CPU で並列に計算できますか?
更新: 方法 2 の構成がハッシュ リストの概念に非常に似ていることを発見しました。ただし、前の文のリンクで参照されているウィキペディアの記事では、ファイルの単純な古いハッシュである方法 1 と比較した場合の衝突の可能性に関して、ハッシュリストの優劣について詳しく説明していません。のハッシュ リストが使用されます。