Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 计算目录的SHA-1_Java_Hash_Directory_Checksum_Sha1 - Fatal编程技术网

Java 计算目录的SHA-1

Java 计算目录的SHA-1,java,hash,directory,checksum,sha1,Java,Hash,Directory,Checksum,Sha1,我试图计算整个目录结构的SHA-1校验和 到目前为止,我所做的是递归地计算每个常规文件的SHA-1,并将所有校验和附加在一起。问题是,这使得计算依赖于遍历文件的顺序 例如,如果我有一个包含这些文件的文件夹 file1.dat file2.dat 另一个文件夹包含相同的文件,但按顺序排列 file2.dat file1.dat 这将计算不同的校验和 如何使SHA-1计算顺序独立 谢谢 在计算SHA-1之前,请尝试对从file.list获得的文件名字符串[]进行排序,或者对file.listFile

我试图计算整个目录结构的SHA-1校验和

到目前为止,我所做的是递归地计算每个常规文件的SHA-1,并将所有校验和附加在一起。问题是,这使得计算依赖于遍历文件的顺序

例如,如果我有一个包含这些文件的文件夹

file1.dat file2.dat

另一个文件夹包含相同的文件,但按顺序排列

file2.dat file1.dat

这将计算不同的校验和

如何使SHA-1计算顺序独立


谢谢

在计算SHA-1之前,请尝试对从file.list获得的文件名字符串[]进行排序,或者对file.listFiles的文件[]进行排序,因为文件是可比较的。Arrays.sort就足够了。请注意,File.list/File.listFile不会以特定的顺序返回项目,尽管它们看起来可能已排序。

好吧,因为您已经准备好了哈希计算算法,所以您可以将所有哈希添加到一个集合中(或不按重要元素的顺序添加的任何其他数据结构)对于每个目录,然后检查集合是否相等


您至少有两种选择:

  • 为目录创建存档文件,然后为其创建摘要。(拉链,罐子)

  • 将所有文件字节读入单字节数组,然后从中创建摘要

  • 在创建摘要之前,使用您的算法对数据进行预排序

  • 创建两个摘要列表并进行比较


  • 就我个人而言,我会选择一种快速、简单的方法

    为什么不在迭代之前对目录中的文件进行排序?我正在计算服务器上的一个哈希值,客户端上的另一个哈希值。如果你真的需要哈希值,那么你将把顺序作为协议的一部分,假设哈希值必须使用文件和目录按算术顺序计算,或者您可以使用@Evgeniy dorofev poster这样的文件名,并通过网络发送文件和目录名1将无法工作,因为归档文件中的文件顺序不能保证相同。2不起作用,因为您忽略了文件边界,例如,两个文本文件“a”和“bc”将创建与两个文件“ab”和“c”相同的哈希。3可能也不够,因为创建哈希时不考虑文件名。@jarnbjo,谢谢您指出这一点。第1点、第2点和第3点必须有预排序数据才能正常工作。但这不是一个大问题。除了第2点的注释外,如果我们只想验证文件的内容集,则边界取决于需要,这可以被忽略。请随意添加您自己的解决方案。AsENOVM也应该考虑使用文件名作为散列计算的一部分,而不仅仅是文件内容。