即时计算 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);
当buf
为NULL
时,返回初始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
是否可以即时(在流中)计算 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);
当buf
为NULL
时,返回初始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