17

この簡単な関数を使用して、特定のファイルの CRC チェックサムを計算します。

long i, j = 0;
int k = 0;
uint crc = 0xFFFFFFFF;
FileInfo file_info = new FileInfo(file);
byte[] file_buffer = new byte[32768];

FileStream file_stream = new FileStream(@file, FileMode.Open);
while ((i = file_stream.Read(file_buffer, 0, file_buffer.Count())) > 0)
{
    for (j = 0; j < i; j++)
    {
        uint before = crc;
        k = (int)((crc ^ file_buffer[j]) & 0x000000FFL);
        uint after = (uint)((crc >> 8) & 0x00FFFFFFL) ^ crc32_table[k];
        crc = after;
        uint test = (uint)((crc << 8) & 0x00FFFFFFL) ^ crc32_table[k];
        MessageBox.Show((~crc).ToString("X"));
    }
}
file_stream.Close();
return ~crc;

私の質問は次のとおりです。たとえば、100MB の大きなファイルがあるとします。最初の 50MB と最後の 50MB の CRC-32 計算と 100MB ファイルの CRC-32 計算の間に何らかの関連性はありますか?

私が尋ねている理由は、生成に時間がかかる非常に大きなファイル (〜 10 GB ギブまたはテイク) がいくつかありますが、それらが生成されている間、ほとんどの部分は静的なままですが、途中の部分 (既知のポイント) ) および開始直後 (ヘッダー、部分/長さとも呼ばれます)。10GB のファイルの CRC-32 チェックサムを計算するにはかなりの時間がかかるので、チャンクで計算する方法はないかと考えていました。

4

4 に答える 4

6

はい。例については、 zlibを参照crc32_combine_()してください。

于 2014-01-19T02:08:34.327 に答える
5

この方程式が重要です。

CRC(a XOR b) == CRC(a) XOR CRC(b)

次のメッセージの CRC を計算するとします。

"Always desire to learn something useful."

次のように CRC を計算する関数が存在します。

crc_join(crc_part1("Always desire to lea"),
         crc_part2("rn something useful."))

crc_part1およびcrc_part2ゼロが示されているようにそれらの引数をパディング ( )\0すると、crc_joinXOR になります。

crc_part1 = crc("Always desire to lea\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
crc_part2 = crc("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0rn something useful.")

crc_part1末尾のゼロは、ルックアップ テーブルで説明できます。では先行ゼロは無視できますcrc_part2

参考文献:


  1. ソフトウェアベースの CRC Youngjuの高速並列アーキテクチャ。やれ、ソンロク。ユン、テギュ。キム、グァンウィ。ピュンとシンチョン。公園
  2. https://en.wikipedia.org/wiki/Cyclic_redundancy_check
于 2013-03-01T07:52:11.960 に答える