Сравнивать файлы побайтно или читать все байты? - PullRequest
3 голосов
/ 14 декабря 2010

Я наткнулся на этот код http://support.microsoft.com/kb/320348, который заставил меня задуматься о том, как лучше всего сравнить 2 файла, чтобы выяснить, отличаются ли они.

Основная идея состоит в том, чтобы оптимизировать мою программу, которая должна проверить, равен ли какой-либо файл, или нет, чтобы создать список измененных файлов и / или файлов для удаления / создания.

В настоящее время я сравниваю размер файлов, если они совпадают, я перейду к контрольной сумме md5 из двух файлов, но после просмотра этого кода, связанного в начале этого вопроса, я задался вопросом, действительно ли это стоит использовать его для создания контрольной суммы 2 файлов (что обычно происходит после получения всех байтов)?

Также, какие еще проверки я должен предпринять, чтобы уменьшить количество проверок каждого файла?

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Считайте оба файла в небольшой буфер (4K или 8K), который оптимизирован для чтения , а затем сравните буферы в памяти (побайтно), которые оптимизированы для сравнение .

Это даст вам оптимальную производительность для всех случаев (где разница в начале, в середине или в конце).

Конечно, первым шагом является проверка, если длина файла отличается, и если это так, файлы действительно разные ..

0 голосов
/ 14 декабря 2010

Если вы еще не вычислили хэши файлов, то вы могли бы также сделать правильное сравнение (вместо того, чтобы смотреть на хэши), потому что, если файлы одинаковы, это тот же объем работы, но если они 'Вы можете остановиться намного раньше.

Конечно, сравнение байта за раз, вероятно, немного расточительно - вероятно, хорошая идея - читать целые блоки за раз и сравнивать их.

...