6

我必须对文件进行指纹匹配才能匹配双胞胎。2013 年的 Java 推荐什么?我还应该比较文件大小,还是这是不必要的检查?

误报的概率应该非常接近0

编辑:很多答案,谢谢。今天备份软件的标准是什么?SHA-256?更高?我猜md5不适合?

4

2 回答 2

13

如果误报的概率必须为零,而不是“低于你被闪电击中的概率”,那么根本就不能使用哈希算法;您必须逐字节比较文件。

对于它的价值,如果您可以使用第三方库,您可以使用Guava逐字节比较两个文件

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

它负责打开和关闭文件以及比较的细节。

如果您愿意接受比被闪电击中的可能性更小的误报,那么您可以这样做

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

它返回 a HashCode,然后您可以测试它与另一个文件的哈希是否相等。(该版本还处理了MessageDigest正确打开和关闭文件等的混乱情况。)

于 2013-03-15T20:21:30.697 回答
1

您是否在问如何在 Java 中获取文件的 md5 校验和?如果是这种情况,请在此处此处阅读已接受的答案。基本上,这样做:

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

我还应该比较文件大小,还是这是不必要的检查?

这是不必要的。

于 2013-03-15T20:20:00.467 回答