在一些代码,我最近写了,我有这样的模式:如何缓存部分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
'