2013-10-31 38 views
1

我正在通過網絡傳輸文件。傳輸過程中的數據丟失容忍度爲零。我被要求計算原始文件和複製文件的SHA256值,以驗證內容是否相同。到目前爲止,我已經基於複製和粘貼文件進行了比較,並讓Windows使用-copy附加到文件名來重命名該文件。我也嘗試在重命名上面重命名文件,以及刪除文件擴展名。到目前爲止,他們都產生相同的散列。我也編寫了改變文件屬性(只是改變了lastWrittenTime和fileCreationTime),這似乎沒有對哈希產生影響。SHA256用於計算散列的文件的哪些部分

Checksum result of copying and pasting a file(explorer appends "-copy to name): 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

Checksum result of renaming the -copy in explorer: 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

Checksum result of changing file extension: 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

創建散列時使用哪個文件部分?

好吧,零容忍是有點多了,如果散列不匹配的文件將不得不重新發布。

+6

...文件的內容? –

+0

發佈你如何計算哈希的代碼。 – Paparazzi

+2

@Blam:真的嗎? – spender

回答

11

整個二進制文件內容通過散列算法進行流式傳輸。文件元數據(例如名稱,日期等)不起作用。

3

首先,一般建議:不要這樣做。使用rsync或類似的東西來做批量文件傳輸。 Rsync經過多年的優化和調試,擁有無數的選項來控制複製的方式(以及是否),並且可以在Windows上使用。不要浪費時間來構建已經構建的東西。

但是,如果你必須...

散列算法通常關心字節,而不是文件。將SHA256應用於文件時,您只需讀取字節並將它們傳遞給算法即可。

如果你想哈希路徑,權限等,你應該在目錄級別做這件事,因爲這些東西構成了目錄的「內容」。目錄沒有標準的字節級表示,所以你可以自己創建一個。看起來像按照排序順序列出的目錄通常就足夠了。並確保每個條目都包含相應內容的散列,無論是文件還是其他目錄。這樣,目錄的散列不僅可以唯一地指定每個子項的名稱和屬性,還可以遞歸地指定子目錄的全部內容。

注意:相同文件具有相同散列的事實實際上可以對您有利,因爲一旦系統意識到具有相同散列的文件已經存在於目的地,就避免傳輸第二個文件。當然,你必須明確地爲此編寫代碼。但是也要注意,這樣做可以在移動或複製文件時允許超便宜的同步,因爲它們將具有與以前相同的散列。只有受影響的目錄(從直接父目錄到根目錄)將具有不同的哈希值。

最後,一個小問題:沒有零容忍這樣的事情。忘記在宇宙的一生中是否會發生SHA256碰撞。伽瑪射線可以翻轉一下,說:「這兩個文件不匹配!」這樣的翻轉很少發生,但比你想象的要多得多。在嘈雜的量子宇宙中,我們應該避免以絕對的方式說話。

+1

最近你可能會得到一個目錄的標準表示,如果目錄本身在一個zip文件中。 – cHao

+0

@cHao:這是矯枉過正,並且不能遞歸地工作。包含每個孩子的散列的簡單文本列表足以保證唯一性。但是,無論如何,這意味着+1,因爲它讓我想起了「小孩哈希」這一點。 –

+0

@MarceloCantos:欣賞細節,零容忍有點多,但如果它們不匹配,我將不得不重新發送文件。 – user2943131