Определение, является ли файл дубликатом

Существует ли надежный способ определить, являются ли два файла тем же? Например, два файла с тем же размером и типом могут или не могут быть тем же двоичным образом (да, я знаю, что это не действительно слово). Я предполагаю, что сравнение одной или двух контрольных сумм файлов поможет, но интересно:

  1. Насколько надежный контрольные суммы при определении, отличаются ли два файла; каковы возможности двух различных файлов, имеющих ту же контрольную сумму?
  2. Надежность увеличилась бы путем применения дополнительных сравнений контрольной суммы?
  3. Какой алгоритм (алгоритмы) контрольной суммы был бы самым эффективным и/или надежным?

Любые идеи, предложения или мысли ценятся!

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

6
задан Carlos 11 May 2010 в 17:19
поделиться

4 ответа

1) Very reliable
2) Not theoretically
3) SHA-1
5
ответ дан 9 December 2019 в 22:30
поделиться

Любой стандартный алгоритм контрольной суммы, например MD5, обеспечит вам надежную проверку для большинства реальных сценариев. Если вам нужна еще большая надежность, перейдите на SHA. http://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms

0
ответ дан 9 December 2019 в 22:30
поделиться

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

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

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

Ваш третий вопрос уже был рассмотрен в ответе leonbloy; MD5 и SHA-1 являются общими.

6
ответ дан 9 December 2019 в 22:30
поделиться

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

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

0
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: