Если вероятность ложных срабатываний должна быть ноль, в отличие от «ниже вероятности того, что вы будете поражены молнией», тогда вообще не может быть использован алгоритм хеширования; вы должны сравнить байты файлов по байтам.
Для чего это стоит, если вы можете использовать сторонние библиотеки, вы можете использовать Guava для сравнения двух файлов байт за байтом с однострочника
Files.asByteSource(file1).contentEquals(Files.asByteSource(file2));
который заботится об открытии и закрытии файлы, а также детали сравнения.
Если вы готовы принять ложные срабатывания, которые менее вероятно, чем удары молнии, то вы могли бы сделать
Files.hash(file, Hashing.sha1()); // or md5(), or sha256(), or...
который возвращает HashCode
, а затем вы можете проверить, что для равенства с хэш другого файла. (Эта версия также касается беспорядочности MessageDigest
, открытия и закрытия файла должным образом и т. Д.).
128-битный или 256-битный хэш обычно хороши для нормального использования. Вы также можете сравнить размер файла, чтобы поместить файлы в разные ведра, а затем только хеш, если имеется более двух файлов с одинаковым размером. – nhahtdh
Разрешены ли сторонние библиотеки? По крайней мере, у Гуавы есть функции, чтобы сделать это значительно проще, чем то, что вам нужно было бы сделать в чистой Java. –
MD5 идеально подходит для этого. Обратите внимание, что MD5 больше не может считаться ** безопасным ** хэш-алгоритмом. Вы должны определить свою ситуацию, если это важно. (Есть ли вероятность того, что хакер может попытаться обмануть ваше программное обеспечение, подумав, что два файла одинаковы?). – Jesper