パフォーマンスとセキュリティの考慮事項はさておき、完全な雪崩効果を持つハッシュ関数を想定すると、データのブロックのチェックサムにはどちらを使用する必要がありますか: CRC32 または N バイトに切り捨てられたハッシュ? つまり、どちらがエラーを見逃す確率が小さいでしょうか? 具体的には:
- CRC32 対 4 バイト ハッシュ
- CRC32 対 8 バイト ハッシュ
- CRC64 対 8 バイト ハッシュ
データ ブロックは、ネットワークを介して転送され、ディスクに繰り返し格納されます。ブロックのサイズは 1KB から 1GB です。
私が理解している限り、CRC32 は 100% の信頼性で最大 32 ビットの反転を検出できますが、その後は信頼性が近づき1-2^(-32)
、一部のパターンではさらに悪化します。完全な 4 バイト ハッシュの信頼性は常に1-2^(-32)
です。
8 バイトのハッシュは、全体的な信頼性 (エラーを見逃す可能性) がはるかに優れている2^(-64)
はずですが、CRC32 よりも優先する必要がありますか? CRC64はどうですか?
答えは、そのような操作で予想されるエラーの種類によって異なると思います。まばらな 1 ビット フリップや大規模なブロック破損が発生する可能性はありますか? また、ほとんどのストレージおよびネットワーク ハードウェアが何らかの CRC を実装していることを考えると、偶発的なビット フリップは既に処理されているはずではないでしょうか?