c - 消息的 Adler32 + adler 总和是否为零(如 CRC32)

标签 c algorithm checksum adler32

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

最佳答案

如您所见,答案是否定的。检查值不需要该属性。事实上,大多数 CRC 校验实现并没有在最后运行 CRC。他们只是检查计算出的 CRC 是否等于存储的 CRC。

关于c - 消息的 Adler32 + adler 总和是否为零(如 CRC32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11798222/

相关文章:

c - 字符串 - '0' 是做什么的(字符串是一个字符)

algorithm - Google Trends的系统设计?

checksum - 通过 cli 访问 zfs 数据集的校验和

encryption - 创建一个小的(<10 位)、不(非常)安全的 "hash"的想法

java - 关于 Java 中 MD5 校验和计算的说明

c - UART 无法接收 GPS NMEA 语句

c - 打印小数位

检查给定矩形是否形成正方形的算法

c - 在c中递归拆分数组

java - 与ArrayList相比,为什么我们不将线性搜索成本算作链表插入操作的前提瓶颈?