Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较文件的Java和哈希算法_Java_Hash_Md5_Sha - Fatal编程技术网

比较文件的Java和哈希算法

比较文件的Java和哈希算法,java,hash,md5,sha,Java,Hash,Md5,Sha,我必须对文件进行指纹识别以匹配双精度指纹。2013年Java推荐什么?我应该也比较文件大小,还是这是一个不必要的检查 假阳性的概率应该非常接近于0 编辑:很多答案,谢谢。现在备份软件的标准是什么?SHA-256?较高的?我想md5不合适?您是否在问如何在Java中获取文件的md5校验和?如果是这样的话,请阅读已接受的答案并回答。基本上,这样做: import java.security.DigestInputStream; ... ... MessageDigest md_1 = Messag

我必须对文件进行指纹识别以匹配双精度指纹。2013年Java推荐什么?我应该也比较文件大小,还是这是一个不必要的检查

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


编辑:很多答案,谢谢。现在备份软件的标准是什么?SHA-256?较高的?我想md5不合适?

您是否在问如何在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
我应该也比较文件大小,还是这是一个不必要的检查


这是不必要的。

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

值得一提的是,若您可以使用第三方库,那个么您可以使用一行代码逐字节比较两个文件

Files.asByteSource(file1).contentEquals(Files.asByteSource(file2));
它负责打开和关闭文件以及比较的详细信息

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

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

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

128位或256位哈希通常适合正常使用。您还可以比较文件大小,将文件放在不同的存储桶中,然后仅在有两个以上相同大小的文件时进行哈希。是否允许使用第三方库?至少,Guava有一些特性使这比在纯Java中所做的要容易得多。MD5非常适合于此。请注意,MD5不能再被视为安全哈希算法。如果这很重要,你必须根据自己的情况来决定。(是否有可能是黑客试图愚弄您的软件,使其认为两个文件是相同的?)@Jesper:如果攻击者能够控制这两个文件,那么它是MD5还是SHA1就无关紧要了。如果攻击者可以控制1个文件,则仍然很难找到第二个前映像攻击。用于比较文件的md5是否被认为是安全的?SHA被认为比md5更安全。但是,两个不同的文件共享同一MD5校验和的概率几乎为零。同样,比较文件大小是不必要的,但我认为最好这样做,因为我们可以跳过昂贵的磁盘读取来计算哈希。MD5是可以的,甚至64位哈希在大多数情况下都足够好。在实际(非安全)使用层面上,发生冲突的可能性极低:我认为您现在需要该方法“toByteArray”@Setheron:为什么这么说?这些操作都不需要
toByteArray
。(而且,即使文件太大而无法放入RAM中,它们也应该可以工作。)@LouisWasserman My bad,由于某些原因,我使用的番石榴版本没有asByteSOurce。我最后做了“Files.equal(原始钱包,修改钱包)”