我正在尝试计算整个目录结构的SHA-1校验和。为目录计算SHA-1
我到目前为止所做的是递归计算每个常规文件的SHA-1并将所有校验和附加在一起。问题是,这使得计算依赖遍历文件
即顺序上,如果我有一个包含文件夹中的文件
file1.dat file2.dat
中包含同一文件的其他文件夹,而是通过有序
file2.dat file1.dat
这将计算不同的校验。
如何使SHA-1计算顺序独立?
谢谢!
我正在尝试计算整个目录结构的SHA-1校验和。为目录计算SHA-1
我到目前为止所做的是递归计算每个常规文件的SHA-1并将所有校验和附加在一起。问题是,这使得计算依赖遍历文件
即顺序上,如果我有一个包含文件夹中的文件
file1.dat file2.dat
中包含同一文件的其他文件夹,而是通过有序
file2.dat file1.dat
这将计算不同的校验。
如何使SHA-1计算顺序独立?
谢谢!
您至少有两种选择与:
创建一个存档文件,目录,然后为它创建的摘要。 (zip,jar)
将所有文件字节读入单字节数组,然后从中创建摘要。
使用算法创建摘要之前的预订数据。
创建摘要的两个列表并对它们进行比较。
就我个人而言,我会选择一个,是快速和容易。
1将不起作用,因为存档中的文件顺序不能保证相同。 2将不起作用,因为你忽略文件边界,例如两个文本文件“a”和“bc”将创建与两个文件“ab”和“c”相同的散列。 3可能还不够,因为创建哈希时不考虑文件名。 – jarnbjo
@ jarnbjo,谢谢你指出。要点1,2和3必须有预先准备的数据才能正常工作。但这不是一个大问题。此外,点2的评论,如果我们只关心验证文件的内容可以忽略不计,那么边界需要依赖。请随时为您添加自己的解决方案。 –
尝试对计算SHA-1之前从File.list中获得的文件名String []进行排序,或对File.listFiles文件进行排序,File是Comparable。 Arrays.sort就够了。请注意,File.list/File.listFile以不特定的顺序返回项目,尽管它们看起来可能已排序。
asenovm还应该考虑使用文件名作为散列计算的一部分,而不仅仅是文件内容。 – jarnbjo
为什么不在一个目录中迭代它们之前订购文件? – Pablo