我正在嘗試計算整個目錄結構的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