2012-09-04 60 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的值。