动态计算CRC,可能与否

问题描述

是否可以即时(在流中)计算CRC?

例如,我有1 GB的数据,我想减少未被发现的错误的可能性。 我想在整个文件中实现一些内容(CRC或哈希), (我已经为每个块(其中包含一些数据包)实现了CRC),

当我们将CRC放在整个文件上时,是否有可能在拥有第一个数据包后立即开始计算CRC,还是必须等待接收到整个文件然后开始计算CRC? / p>

解决方法

是的。 CRC和我所知道的每个哈希都可以流式传输。它们具有一个很小的有限状态,该状态随着数据通过它们的更新而更新。对于CRC,状态为CRC本身。

zlib中的CRC采用以下形式:

unsigned long crc32(unsigned long crc,const unsigned char *buf,unsigned len);

bufNULL时,返回初始CRC。因此它的用法如下:

unsigned long crc = crc32(0,NULL,0);    // initial CRC
for (...) {                               // some sort of loop
    ...                                   // generating a chunk of data
    crc = crc32(crc,buf,len);           // update the CRC with the data
    ...                                   // this all gets repeated many times
}
...                                       // loop is done,crc has the CRC