Сравнение двух файлов в C ++ - PullRequest
4 голосов
/ 27 февраля 2012

У меня есть функция, которая сравнивает два файла, чтобы увидеть, совпадают ли они. Он читает файлы побайтно и проверяет, совпадают ли они.
Сейчас у меня проблема в том, что для больших файлов эта функция занимает довольно много времени.

Какой лучший и быстрый способ проверить, совпадают ли файлы?

Ответы [ 5 ]

7 голосов
/ 27 февраля 2012

Если ваши файлы не совпадают, вероятно, они имеют одинаковый размер? Если нет, вы можете сразу определить размеры файлов (fseek до конца, ftell, чтобы определить положение), и если они отличаются, то вы знаете, что они не одинаковы без сравнения данных. Если размер одинаковый, не забудьте вернуться к началу.

Если вы прочитаете ваши файлы в большие буферы памяти и сравните каждый буфер с помощью memcmp (), вы улучшите производительность. Вам не нужно читать весь файл сразу, просто установите большой размер буфера и считайте блоки такого размера из каждого файла для каждой итерации сравнения в вашем цикле. Функция memcpy будет работать с 32-битными значениями, а не с 8-битными байтами.

2 голосов
/ 27 февраля 2012

Если вы действительно хотите сравнение двух файлов методом грубой силы, mmaping может помочь .

Если вы знаете структуру файлов того, что вы читаете, прочитайте уникальные разделы, которые позволяют вам идентифицироватьих быстро (например, заголовок и соответствующие куски / разделы).Конечно, вы захотите получить его основные атрибуты перед сравнением.

Создание хэшей (или чего-то еще), если вы делаете несколько сравнений.

0 голосов
/ 27 февраля 2012

Хотя есть ряд примеров криптографических хеш-функций, использующих SHA или MD5, для сравнения файлов лучше использовать некриптографический хеш, поскольку он будет быстрее:

https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions

Хэш FNV считается быстрым для ваших нужд:

https://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash

0 голосов
/ 27 февраля 2012

Если вы не знакомы с поиском хэширования в Google по поводу алгоритмов "MD5" или "SHA".Хеширование является одним из эффективных подходов для проверки согласованности файлов.Нужно только найти реализацию одного из этих алгоритмов и проверить их;например:

if(md5(file1Path) == md5(file2Path))
    cout<<"Files are equal"<<endl;
else
    cout<<"Files are not equal"<<endl;
0 голосов
/ 27 февраля 2012

Чтение файлов кусками размера X. С X до 1-10-50 мегабайт. Используйте memcmp() на этих кусках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...