首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java和Hash算法比较文件

用Java和Hash算法比较文件
EN

Stack Overflow用户
提问于 2013-03-16 04:13:10
回答 2查看 13.2K关注 0票数 6

我得提取指纹文件才能匹配双胞胎。2013年的Java推荐是什么?我是否也应该比较文件大小,或者这是不必要的检查?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-16 04:21:31

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

值得注意的是,如果可以使用第三方库,则可以使用Guava通过一行程序逐字节比较两个文件

代码语言:javascript
复制
Files.asByteSource(file1).contentEquals(Files.asByteSource(file2));

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

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

代码语言:javascript
复制
Files.hash(file, Hashing.sha1()); // or md5(), or sha256(), or...

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

票数 13
EN

Stack Overflow用户

发布于 2013-03-16 04:20:00

您是否在询问如何在Java中获得文件的md5校验和?如果是这样的话,请阅读接受的答案herehere。基本上,这样做:

代码语言:javascript
复制
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

我是否也应该比较文件大小,或者这是不必要的检查?

这是不必要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15441315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档