Возможно ли вычисление CRC-32 в разбиении?

Я использую эту тривиальную функцию для вычисления контрольной суммы 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;

Мой вопрос таков: скажем, у меня есть большой файл, скажем 100 МБ. Есть ли какая-либо связь между вычислением CRC-32 первых 50 МБ и последних 50 МБ и вычислением CRC-32 файла 100 МБ?

Я спрашиваю, у меня есть очень большие файлы (~ 10 ГБ дает или take), для генерации которых требуется некоторое время, но пока они генерируются, большинство частей остаются статичными, однако части в середине (известная точка) и прямо в начале (заголовок, также известная часть / длина). Расчет контрольной суммы CRC-32 для файла размером 10 ГБ занимает довольно много времени, поэтому мне было интересно, есть ли способ сделать это по частям?

15
задан Nayuki 4 June 2015 в 04:18
поделиться