2015-12-08 55 views
0

我有問題需要比較.tar.gz文件中的文件,以確保gzip中的文件都不重複。我目前正在使用ICSharpCode.SharpZipLib,它可以很容易地檢查Zip文件中的重複項,因爲ZipEntry具有「CRC」屬性。這很簡單,因爲我可以獲取crc和文件大小,並使用LINQ找到任何匹配散列和大小的文件,然後拋出錯誤或執行任何必要的操作。計算散列或比較c#中gzip文件的內容

但是,除了標準的GetHashCode方法外,TarEntry沒有這樣的屬性或方法,我的理解也是從文件元數據計算哈希值,因此同一個文件的副本沒有相同的哈希值。我能(快​​速)計算gzip文件內容的散列嗎?還是有另一種方法來比較內容?

+1

如果你只是想檢查'.tar.gz'文件本身是否是其他'.tag.gz'文件的副本,那麼該文件的'sha1'或'sha256'散列就足夠了。如果打算打開存檔並單獨檢查每個文件,則不確定要在那裏顯示哪些內容,但加密散列仍然是確定內容相等的最佳選擇。 – ray

+0

是的,我正在比較.tar.gz中的每個文件,以確保文件中沒有重複項。 (還是)感謝你的建議。我稍後可能會執行它來自己檢查.tar.gz文件。 – ilyketurdles

+0

不幸的是,我沒有看到你怎麼做你想做的事情,而無需首先提取所有內容。看起來你需要解壓+解壓檔案,然後用加密哈希處理每個單獨的文件,但是你必須將所有內容與其他所有內容進行比較 - 「O(n^2)」操作。我認爲你想要做的是一個壞主意。考慮直接檢查檔案。如果你擔心重複,那麼在它們被創建之前先試着照顧它。 – ray

回答

0

首先,如果兩個文件具有不同的長度,那麼馬上就知道它們不可能相等。因此,將它用作zip或tar作爲第一個過濾器。其次,散列會告訴你兩個文件是否不同,但它不能告訴你它們是相同的。如果平等很少,那麼散列是排除大多數競爭者平等的好方法。假設散列值已經被計算出來。但是,如果兩個散列值相等,則需要直接比較文件以查看它們是否相等。

如果一個散列還沒有被計算出來,那麼跳過計算一個散列並且簡單地比較長度相等的文件通常會更快。唯一不會更快的方法是,如果您經常擁有相同長度和通用前綴的文件集,以便它們僅在文件中有一定的長度差異。