2012-12-13 73 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