如何缓存部分CRC32校验,所以我并不需要多次计算的呢?(How to cache partial

2019-10-17 05:10发布

在一些代码,我最近写了,我有这个模式:

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计算(90%+),用于所有N个并始终与“ new_data

Answer 1:

您没有提供提示什么语言,这是一个标签,我不熟悉的某个版本的crc32()作为证明,具有参数的功能。 在任何情况下,我想你要找的是crc32_combine()的函数zlib的 。

实际的参数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的值。



文章来源: How to cache partial crc32 checksums so I don't need to calculate it multiple times?