2013-03-15 4 views
2

Мне нужно отпечатать файлы в соответствии с дуплетами. Что рекомендуется с Java в 2013 году? Должен ли я также сравнивать размер файла, или это лишняя проверка?Алгоритм Java и Hash для сравнения файлов

вероятность ложноположительных должна быть очень близка к 0

EDIT: Много ответов, спасибо. Каков стандарт программного обеспечения для резервного копирования сегодня? SHA-256? выше? Думаю, md5 не подходит?

+0

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

+0

Разрешены ли сторонние библиотеки? По крайней мере, у Гуавы есть функции, чтобы сделать это значительно проще, чем то, что вам нужно было бы сделать в чистой Java. –

+0

MD5 идеально подходит для этого. Обратите внимание, что MD5 больше не может считаться ** безопасным ** хэш-алгоритмом. Вы должны определить свою ситуацию, если это важно. (Есть ли вероятность того, что хакер может попытаться обмануть ваше программное обеспечение, подумав, что два файла одинаковы?). – Jesper

ответ

9

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

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

Files.asByteSource(file1).contentEquals(Files.asByteSource(file2)); 

который заботится об открытии и закрытии файлы, а также детали сравнения.

Если вы готовы принять ложные срабатывания, которые менее вероятно, чем удары молнии, то вы могли бы сделать

Files.hash(file, Hashing.sha1()); // or md5(), or sha256(), or... 

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

+0

MD5 в порядке, или даже 64-битный хеш достаточно хорош для большинства целей. Вероятность столкновения чрезвычайно низка на уровне практического (небезопасного) использования: http://en.wikipedia.org/wiki/Birthday_paradox#Probability_table – nhahtdh

+0

Я думаю, что вы хотите, чтобы метод теперь «toByteArray» – Setheron

+0

@Setheron: почему ты это говоришь?Ни одна из этих операций не требует 'toByteArray'. (Кроме того, они должны работать, даже если файл слишком велик, чтобы вписаться в ОЗУ.) –

1

Вы спрашиваете, как получить контрольные суммы md5 файлов на Java? Если это так, прочитайте принятые ответы here и here. В основном, это сделать:

import java.security.DigestInputStream; 
... 
... 

MessageDigest md_1 = MessageDigest.getInstance("MD5"); 
MessageDigest md_2 = MessageDigest.getInstance("MD5"); 
InputStream is_1 = new FileInputStream("file1.txt"); 
InputStream is_2 = new FileInputStream("file2.txt"); 
try { 
    is_1 = new DigestInputStream(is_1, md_1); 
    is_2 = new DigestInputStream(is_2, md_2); 
} 
finally { 
    is_1.close(); 
    is_2.close(); 
} 
byte[] digest_1 = md_1.digest(); 
byte[] digest_2 = md_2.digest(); 

// compare digest_1 and digest_2 

Должен ли я также сравнить размер файла, или это ненужный чек?

Это не нужно.

+0

является md5 для сравнения файлов считаются безопасными? – Stig

+0

SHA считается более надежным, чем MD5. Тем не менее, вероятность двух разных файлов, имеющих одну и ту же контрольную сумму MD5, почти равна нулю. – Barney

+0

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

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