用于比较文件的Java和Hash算法

时间:2013-03-15 20:13:10

标签: java hash md5 sha

我必须指纹文件才能匹配双线。在2013年推荐使用Java?我还应该比较文件大小,还是不必要的检查?

假阳性的概率应非常接近0

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

2 个答案:

答案 0 :(得分:12)

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

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

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

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

如果你愿意接受不太可能被闪电击中的误报,那么你可以做到

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

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

答案 1 :(得分:1)

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

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
  

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

没必要。