即时计算 CRC,可能与否

calculating the CRC on the fly, possible or not

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

例如,我有 1 GB 的数据,我想减少未检测到错误的可能性。 我想在整个文件上实现一些东西(CRC 或 Hash), (我已经为每个块实现了 CRC,其中包含一些数据包),

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

是的。 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