1

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

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'])

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

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

4

1 回答 1

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 值才能组合它们。

于 2012-09-06T13:23:50.937 回答