是否有任何快速算法可以比較兩個文件(用於驗證目的)而無需讀取整個內容?快速文件完整性驗證
1
A
回答
2
您可以在這兩個文件上使用MD5哈希,並以這種方式進行比較。然而,它在技術上讀取整個文件。如果沒有檢查我不認爲,你將無法100%確定。
在C#中一個會以下列方式(對不起,你沒有提到特定語言)這樣做:
protected string GetMD5HashFromFile(string fileName)
{
byte[] retVal = { };
using (FileStream file = new FileStream(fileName, FileMode.Open))
using (MD5 md5 = new MD5CryptoServiceProvider())
{
retVal = md5.ComputeHash(file);
}
if (retVal.Length > 0)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
else
{
return string.Empty;
}
}
bool CompareFiles(string fileName1, string fileName2)
{
return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2));
}
1
你可以寫,讀取文件的位自定義CRC程序。例如每1k有16個字節或類似的東西,而不是對整個文件進行CRC校驗。當然,這樣做風險更大,因爲數據可能會改變,而不會影響您比較的區塊。但CRC也有點風險,因爲兩個完全不同的數據集可能會返回相同的值。
0
恐怕你無法避免完整地讀取這兩個文件,以確保它們是平等的。
您可以先檢查兩個文件的大小;如果它們不同,則文件是不同的(但是關於文本文件只會在行分隔符上有所不同)。
如果大小相同,我沒有看到任何正確的方法去更進一步,但開始閱讀這兩個文件。當然,只要緩衝區不同,它可以立即停止,但它只能說明文件是,確實等於當最後一個字符被處理時。
1
沒有算法可以100%確定文件是相同的,除非你讀每個字節。證明很簡單 - 假設存在這種算法,我們用它來比較兩個文件。這意味着一些字節不被算法讀取。我可以通過在一個文件中更改這些字節而導致算法失敗。
1
在數學上不可能確定兩個相同大小的文件完全相同而沒有完全讀取它們,但是很可能確定它們不是而是不等於而沒有完全讀取。這可以通過各種方式完成,例如使用散列函數或短路比較。
相關問題
- 1. BitTorrent驗證文件的完整性?
- 2. 驗證文件的完整性?
- 3. 驗證文檔的完整性
- 4. 快速驗證錯誤與快速驗證程序
- 5. 快速導入/快速導出git/bzr:標記文件對歷史完整性的重要性是什麼?
- 6. 快速驗證器中的驗證
- 7. 如何驗證.git文件夾的完整性?
- 8. 驗證JAR文件的完整性是否必要?
- 9. 用於文件完整性驗證的簽名/散列選擇
- 10. 使用邏輯條件驗證文本字段的完整性
- 11. 驗證Android和PHP之間的文件數據完整性
- 12. 使用Keys文件驗證Struts下載的完整性
- 13. 快速表單驗證
- 14. 快速驗證方法
- 15. 快速角度驗證
- 16. 如何驗證Linux tarball的完整性?
- 17. 請求驗證/數據完整性
- 18. 驗證API響應完整性
- 19. ImageMagick驗證圖像完整性
- 20. 使用ffmpeg快速檢查目錄內的視頻文件的完整性
- 21. 我可以使用哪些文件校驗和完整性驗證的Windows 8?
- 22. 數據驗證:快速失敗,早期失敗與完全驗證
- 23. gcc - 快速 - 限制的完整列表
- 24. Eclipse快速修復不完整
- 25. 快速:獲取完整路由參數
- 26. 完整的Xml驗證
- 27. 快速調整mmap文件的大小
- 28. 文件完整性檢查
- 29. 執行文件完整性
- 30. 放寬驗證爲'快速創建'
謝謝凱爾,我會試一試 – SharpAffair 2010-03-10 19:18:00
它不'技術上'讀整個文件,它*讀取整個文件*! – bmargulies 2010-03-10 19:21:36
當然,這是「技術上」說的含義。 – 2010-03-10 19:25:59