2012-09-04 30 views
1

在一些代码,我最近写了,我有这样的模式:如何缓存部分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]'开始于不同的值,并在任何时间点以不同的值结束,但对于所有N,crc32计算几乎总是执行(90%+),并始终以'new_data'

回答

1

您没有提供提示这是什么语言和一个标签,我不熟悉带有参数的crc32()函数版本。在任何情况下,我认为你在寻找的是zlibcrc32_combine()函数。

的参数的实际crc32()功能的zlib(在C)是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的值。