web-dev-qa-db-ja.com

CRC32(C)を0に戻すことはできますか?

CRC32の合計とCRC32Cが特に0に戻るかどうか疑問に思っていますか?十分な大きさのデータセットがあれば、簡単な答えは「はい」です。ただし、CRC32C標準には、これを明示的に防止するプロビジョニングがあるかどうか疑問に思いました。

これの使用例は、リモートファイルが空であるかどうかをチェックできる必要があり、CRC32Cチェックサムだけがあることです。つまり、CRC32Cが0の場合、ファイルは空であることが保証されていると推測できます。

可能であれば、これが定義されている規格への参照を提供してください。

17
dtoux

ゼロは、CRC32チェックサムの他の値と同じくらい可能性があります。 CRCは基本的に、入力全体(1つの大きな2進数と見なされます)を事前に選択された値で除算する余りです。入力がたまたまその値で割り切れる場合、余り、つまりCRCはゼロです。

19
Yanek Martinson

@Yanekはほぼ完全に正しいです。

楽しみのために、CRC-32Cをゼロにする5文字のシーケンスを次に示します。DYB|O。これは、ゼロを与える16進数の4バイトのシーケンスです。ab 9b e0 9b。実際、それが可能な唯一の4バイトシーケンスです。ゼロになる3バイト以下のシーケンスはありません。これは、@ Yanekが正確に正しくない場合です。つまり、3バイト以下のシーケンスの場合、ゼロの可能性はそれほど高くありません。これらの場合、ゼロになる確率はゼロです。

27
Mark Adler

ただし、32ビットCRCではなく、これはどうでしょうか。

1011 | 110011001010.000
       1011
       ----
        1111
        1011
        ----
         1001
         1011
         ----
           1000
           1011
           ----
             1110
             1011
             ----
              1011
              1011
              ----
                  0000 (...)
                  1011
                  ----
                  1011
                  1011
                  ----
                  0000

または:

1100 | 11001010.000
       1100
       ----
           1010
           1100
           ----
            1100
            1100
            ----
            (...) 0
0
Sparky