@Limbend

C#. Какой алгоритм контрольной суммы выбрать?

Задача: сравнить два файла, и определить, что они копии друг друга.

Тип файлов - неограничен. (большинство- файлы проектов в различных ide, документы и т.п. Количество файлов - неограничен. (тестируется на 10 000шт.)

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

P. S. Опробовал CRC32 и MD5. MD оказался примерно в 2 раза быстрее, но думаю у меня была не лучшая реализация CRC32...
  • Вопрос задан
  • 3090 просмотров
Решения вопроса 1
GavriKos
@GavriKos
MD5 и CRC32 не обеспечивает отсутствие коллизий, поэтому использовать только контрольные суммы некорректно. Как минимум сравнивайте еще и размер, причем сначала его.

По факту выбора - я бы выбирал тот алгоритм, для которого руками не надо писать реализацию. Потому что задача стоит сравнить два файла, а не написать вычисление контрольной суммы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Собственно напрашивается таблица в виде
"полное имя файла"
"CRC"
"MD5"

и если задача не запрещает sql - то файлы-клоны отлично будут найдены как
select * from table where MD5 in (
            select MD5 from table group by MD5 having count(*)>1
)
order by MD5


MD5 можно заменить на CRC32 или даже скомбинировать их как MD5+CRC32 - вероятность одновременной коллизии и в CRC32 и MD5 получится как произведение вероятностей коллизии для каждого из алгоритмов - этого скорее всего хватит для военно-космической приемки -)
Ответ написан
AxisPod
@AxisPod
Все хэш-функции подвержены коллизиям. Есть смысл сравнивать размер, затем хэш и уж если они равны, то сравнивать целиком файлы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы