4

CRC-32には、メッセージの最後にCRCを追加すると、全体のCRCを計算してメッセージの検証を実行できるというこのすばらしい特性があり、チェックサムに合格すると、最終結果はゼロになります。

このプロパティは、CRC-32の兄弟であるAdler32にも当てはまると思われますか?

短い答えは「いいえ」のようですが、何かを見逃していないことを確認したかっただけです。

ここのサンプルメッセージhttp://en.wikipedia.org/wiki/Adler-32を使用して、zlib実装を使用して以下のテストプログラムを作成しました。

#include <zlib.h>
#include <stdio.h>
#include <string.h>

void print_sum( const char * str )
{
   uLong asum = 0;
   asum = adler32( 0, Z_NULL, 0 );
   asum = adler32( asum, str, strlen(str) );
   printf( "%x\n", asum);
}

int main (int argc, char** argv)
{
   const char * msg1 = "Wikipedia";
   const char * msg2 = "Wikipedia\x98\x03\xe6\x11";
   const char * msg3 = "Wikipedia\x11\xe6\x03\x98";

   print_sum( msg1 );
   print_sum( msg2 );
   print_sum( msg3 );
}

そして、これらは結果です:

11e60398
248c052a
23da052a
4

1 に答える 1

3

あなたが見つけたように、答えはノーです。そのプロパティはチェック値には必要ありません。実際、ほとんどの CRC チェックの実装では、最後に CRC を実行しません。計算されたCRCが保存されたCRCと等しいかどうかを確認するだけです。

于 2012-08-03T16:07:53.443 に答える