在我最近写的一些代码中,我有这种模式:
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}}“
答案 0 :(得分:1)
您没有提供有关标记的语言的提示,而且我不熟悉具有如图所示参数的crc32()
函数的版本。在任何情况下,我认为您正在寻找的是zlib的crc32_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值才能将它们组合起来。