2013-06-07 4 views
0

Мне нужно синхронизировать файлы из каталога A в каталог B. Я проверяю файлы в A, а затем сравниваю их с файлами в B один за другим. Если в B указан файл с именем A, я проверяю, отличаются ли файлы, сравнивая их размер. Если размеры файлов различны, я регистрирую их и перехожу к следующему файлу. Однако, если размеры файлов одинаковы, мне нужно проверить, что содержимое файлов также отличается. Для этого я решил создать хэши обоих файлов и сравнить их. Это лучше или я должен сравнивать байты файлов по байтам? Также скажите, почему вы выбрали один из методов.Как определить, идентичны ли два файла?

Я использую C# (.NET 4) и вам необходимо сохранить все файлы на B, реплицируя недавно добавленные файлы на A и сообщая (и пропуская) любые дубликаты.

Спасибо.

EDIT: эта работа будет работать в ночное время, и у меня есть возможность хранить хэши файлов только в каталоге B, каталог A будет заполнен динамически, поэтому я не могу предварительно использовать эти файлы. Кроме того, какие хэш-алгоритмы лучше для этой цели, так как я хочу избежать хэш-коллизий.

ответ

0

У вас уже есть функция hash. Ваша хеш-функция - file-->(filename, filesize). Кроме того, поскольку у вас может быть только один файл с заданным именем файла в каталоге, вы гарантированно не должны иметь более одного столкновения для каждого файла за прогон.

Вы спрашиваете, нужен ли вам лучший номер. Ну, я не знаю, соответствует ли производительность с хэш-функцией, которую у вас уже есть? Если вам это подходит, вам не нужна лучшая хеш-функция.

0

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

Но если хеш-коды совпадают, то вы точно не знаете, действительно ли файлы одинаковы.

Если вы используете 32-битный хеш-код, тогда есть вероятность 1 из 2^32, что файлы разные, даже если хеш-код тот же. Для 64-битного хеш-кода вероятность, естественно, равна 1 в 2^64.

Хранение хэш-кодов для всех файлов на B будет делать сравнение с исходными текстами намного быстрее, но тогда вы должны решить, что делать, если два хеш-кода являются одинаковыми. У вас есть шанс и предположить, что они оба одинаковы? Или вы идете и делаете побайтовое сравнение после того, как обнаружите два файла с одинаковым хэшем?

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

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

Таким образом, я бы, скорее всего, просто сделал сравнение каждый раз и не беспокоился о хэшировании (кроме того, что вы уже делаете при сравнении имени и размера файла).

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

1

Если вам нужно синхронизировать файлы, есть еще одна вещь, которую вы можете сравнить: дата файла - если это не так, файл, скорее всего, был изменен.

Кроме того, в большинстве случаев хеш (я бы выбрал md5 или sha1 - не crc из-за ограниченного диапазона значений и, следовательно, довольно частых столкновений). И если эти хеши равны, вы должны сравнить побайтовые байты. Конечно, это дополнительный шаг, но он редко нужен, если вообще.

На самом деле вы должны сохранить хэш на B, поэтому вам не нужно его пересчитывать каждый раз, но вы должны убедиться, что файлы на B не могут быть изменены без обновления их хэшей.

Смежные вопросы