如何缓存部分crc32校验和,所以我不需要多次计算?

时间:2012-09-04 20:22:29

标签: performance caching crc32

在我最近写的一些代码中,我有这种模式:

from zlib import crc32

new_data = get_some_input()

crc32List['stream1'] = crc32(new_data, crc32List['stream1']) & 0xffffffffL
crc32List['stream2'] = crc32(new_data, crc32List['stream2']) & 0xffffffffL
...
crc32List['streamN'] = crc32(new_data, crc32List['streamN']) & 0xffffffffL

在我看来,那里有一些冗余计算,如果我能找到一个名为magic(x, y)的函数执行以下缓存,我会很高兴:

crc32List['cached'] = crc32(new_data, 0) & 0xffffffffL

crc32List['stream1'] = magic(crc32List['cached'], crc32List['stream1'])
crc32List['stream2'] = magic(crc32List['cached'], crc32List['stream2'])
...
crc32List['streamN'] = magic(crc32List['cached'], crc32List['streamN'])

'magic(x, y)'使用缓存的'x'crc32值并返回与“crc32(new_data, y) & 0xffffffffL”相同的结果

当然'stream[0:N]'以不同的值开头,并且在任何时间点都以不同的值结束,但crc32计算几乎总是对所有N执行(90%+)并始终使用'{{ 1}}“

1 个答案:

答案 0 :(得分:1)

您没有提供有关标记的语言的提示,而且我不熟悉具有如图所示参数的crc32()函数的版本。在任何情况下,我认为您正在寻找的是zlibcrc32_combine()功能。

zlib(在C中)中实际crc32()函数的参数是crc32(crc, buf, len),其中crc是起始CRC-32值,buf是指向计算CRC-32的字节数,len是字节数。该函数返回更新的CRC-32值。

鉴于:

crc32(crc32(0, seq1, len1), seq2, len2) == crc32_combine(crc32(0, seq1, len1), crc32(0, seq2, len2), len2)

注意crc32_combine()需要知道第二个序列的长度以及两个CRC-32值才能将它们组合起来。