Определение того, является ли файл дубликатом
Есть ли надежный способ определить, являются ли два файла одинаковыми? Например, два файла одинакового размера и типа могут быть одинаковыми или не одинаковыми (да, я знаю, что это на самом деле не слово). Я предполагаю, что сравнение одной или двух контрольных сумм файлов поможет, но мне интересно:
- Насколько надежны контрольные суммы при определении, отличаются ли два файла; каковы шансы двух разных файлов, имеющих одинаковую контрольную сумму?
- Повысится ли надежность при применении дополнительных сравнений контрольных сумм?
- Какой алгоритм (ы) контрольной суммы будет наиболее эффективным и / или надежным?
Любые идеи, предложения или мысли приветствуются!
PS Код для этого написан на Java, работающем в системе nix, но общий ввод или независимый от платформы ввод наиболее полезен.
4 ответа
Невозможно с уверенностью узнать, являются ли два файла одинаковыми, если вы не сравните их байт за байтом. Это похоже на то, как вы не можете гарантировать, что коллекция содержит или не содержит данный объект, если вы не проверите каждый элемент в коллекции.
Контрольные суммы в основном хэш. Насколько они хороши для ваших целей, зависит от того, насколько критически важно ваше приложение. Конечно, возможно создать хеш-функцию с низким риском столкновения; В конце концов, пароли хэшируются даже в ситуациях, когда они защищают конфиденциальные данные, и вы не захотите иметь второй действительный пароль в своей учетной записи. Если вы не пишете код, скажем, для банка, сильный алгоритм контрольной суммы должен обеспечить очень хорошее приближение.
Использование нескольких контрольных сумм повысит надежность в том и только в том случае, если в разных алгоритмах контрольной суммы используются разные хеш-функции.
Ваш третий вопрос уже решен ответом leonbloy; MD5 и SHA-1 являются общими.
Любая контрольная сумма даст вам ложное срабатывание для очень небольшого числа случаев. Если вы можете жить с этим, хорошо. Если нет, то способ сделать это - сначала выполнить сравнение контрольной суммы, а если контрольные суммы равны, то байтовый тест. Побайтовый тест будет проводиться очень редко, поэтому усредненная стоимость за множество сравнений будет очень мала. ОДНАКО это не тот случай, когда большинство ваших сравнений должны возвращать "true".
Это также зависит от того, сколько разных файлов вы тестируете. Вычисление высоконадежной контрольной суммы почти так же дорого, как и сравнение - если каждый файл сравнивается примерно один раз, то сравнение может быть дешевле.
Любой стандартный алгоритм контрольной суммы, такой как MD5, даст вам надежный тест для большинства реальных сценариев. Если вам нужно еще больше надежности, иди SHA. http://en.wikipedia.org/wiki/Cryptographic_hash_function