Функция Zlib CRC не соответствует чтению файлов в больших блокахC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция Zlib CRC не соответствует чтению файлов в больших блоках

Сообщение Anonymous »

Я использую функцию CRC в Zlib для расчета CRC большого файла. Я сопоставляю файл в кусках 1 ГБ для передачи функции CRC, и я заметил, что, если я изменю размер кусков на 5 ГБ или больше, возвращаемое значение CRC больше не такое же, как и значение CRC, рассчитанное с небольшими кусочками (1 ГБ - 4 ГБ. Все возвращают один и тот же CRC). Кроме того, для размеров кусок 5 ГБ и больше, расчет CRC намного быстрее: 3 секунды в файле 14 ГБ против 22 секунды при использовании 1-4 ГБ кусочек. < /P>
Кто-нибудь знает, почему это происходит? Руководство https://zlib.net/manual.html, похоже, не упоминает этот тип поведения для функций CRC.
uLong crc = crc32(0L, Z_NULL, 0);
size_t offset = 0;
size_t page_size = sysconf(_SC_PAGE_SIZE);
const size_t num_maps = 1000000000 / page_size;
const size_t MAX_MAP_SIZE = num_maps * page_size; // map 1GB to mmap at a time

size_t file_size= fs::file_size(file);
size_t map_size = 0;

while (offset < file_size)
{
if (file_size - offset > MAX_MAP_SIZE)
map_size = MAX_MAP_SIZE;
else
map_size = file_size - offset;

void* buf = mmap(NULL, map_size, PROT_READ, MAP_PRIVATE, fd, offset);
crc = crc32(crc, (unsigned char *)buf, map_size);
munmap(buf, map_size);

offset += map_size;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ger-blocks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»