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

' magic(x, y)'はキャッシュされた'x'crc32値を使用し、''と同じ結果を返しcrc32(new_data, y) & 0xffffffffLます

もちろん、' stream[0:N]'は異なる値で始まり、任意の時点で異なる値で終わりますが、crc32計算は、ほとんどの場合(90%+)すべてのNに対して実行され、常に' 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()それらを組み合わせるには、2番目のシーケンスの長さと2つのCRC-32値を知る必要があることに注意してください。

于 2012-09-06T13:23:50.937 に答える