Делает ли Adler32 сообщения + сумму адлера в ноль (например, CRC32)

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

1 ответ

Решение

Как вы уже нашли, ответ - нет. Это свойство не требуется для проверки значения. Фактически большинство реализаций проверки CRC не запускают CRC до конца. Они просто проверяют, равен ли вычисленный CRC сохраненному CRC.

Другие вопросы по тегам