2012-12-13 35 views
1

我正在尝试计算整个目录结构的SHA-1校验和。为目录计算SHA-1

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

即顺序上,如果我有一个包含文件夹中的文件

file1.dat file2.dat

中包含同一文件的其他文件夹,而是通过有序

file2.dat file1.dat

这将计算不同的校验。

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

谢谢!

+2

为什么不在一个目录中迭代它们之前订购文件? – Pablo

回答

0

您至少有两种选择与:

  1. 创建一个存档文件,目录,然后为它创建的摘要。 (zip,jar)

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

  3. 使用算法创建摘要之前的预订数据。

  4. 创建摘要的两个列表并对它们进行比较。

就我个人而言,我会选择一个,是快速和容易。

+0

1将不起作用,因为存档中的文件顺序不能保证相同。 2将不起作用,因为你忽略文件边界,例如两个文本文件“a”和“bc”将创建与两个文件“ab”和“c”相同的散列。 3可能还不够,因为创建哈希时不考虑文件名。 – jarnbjo

+0

@ jarnbjo,谢谢你指出。要点1,2和3必须有预先准备的数据才能正常工作。但这不是一个大问题。此外,点2的评论,如果我们只关心验证文件的内容可以忽略不计,那么边界需要依赖。请随时为您添加自己的解决方案。 –

2

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

+0

asenovm还应该考虑使用文件名作为散列计算的一部分,而不仅仅是文件内容。 – jarnbjo

0

好吧,既然你已经有了散列计算算法,你可以将所有散列添加到一个集合(或任何其他不重要的元素顺序的数据结构)和每个目录中,然后检查集等于

Set Class

+0

我正在计算一个服务器上的哈希值,另一个是客户端上的哈希值。 – asenovm

+0

如果你真的想要散列,那么你将把该命令作为协议的一部分,可以说散列必须使用alhabetical命令中的文件和目录进行计算,或者可以使用@Evgeniy Dorofeev发布的文件名,并发送文件和dirs名称通过网络 – fredcrs