NET问答: C# 中是否有最高效的方式对大文件做 checksum ?
咨詢區
Dario:
我需要在多臺機器間同步大文件,不過文件高達 6G,通常我都是每幾周手工同步一次,考慮到文件的文件名經常變,為了檢驗一致性,我考慮使用 checksum 機制。
我的計劃是在 源機器 和 目標機器 上做 校驗和 ,然后在機器間copy文件的時候帶上校驗和,從而判斷文件的完整性,我嘗試用下面的代碼做這件事情。
static?string?GetChecksum(string?file){using?(FileStream?stream?=?File.OpenRead(file)){SHA256Managed?sha?=?new?SHA256Managed();byte[]?checksum?=?sha.ComputeHash(stream);return?BitConverter.ToString(checksum).Replace("-",?String.Empty);}}現在遇到的問題是:
SHA256 模式下,1.6G 文件需要耗費 20分鐘算校驗和。
MD5 模式下,1.6G 文件需要6.15分鐘算校驗和。
請問是否有更高效的方式來計算 校驗和 呢?
回答區
Anton Gogolev:
其實問題在于 SHA256Managed 一次只能讀取 4096 byte,這對于 磁盤IO 的吞吐量來說實在太小了。
要想加速,可以用 BufferedStream 來包裹 FileStream,從而提高 FileStream 默認的 4096 的大小,不過這個值可以根據自己場景設置一個合理的范圍,這里我設置成 1M。
//?Not?sure?if?BufferedStream?should?be?wrapped?in?using?block using(var?stream?=?new?BufferedStream(File.OpenRead(filePath),?1024?*?1024)) {//?The?rest?remains?the?same }在我的機器上。
SHA256 模式下,2G 文件需要 2分鐘 算校驗和。
MD5 模式下,2G 文件需要 1分鐘 算校驗和。
Fabske:
你可以了解一下 XxHash.Net, github地址:https://github.com/wilhelmliao/xxHash.NET
而且 xxHash 算法看起來是最快的,下面是 xxHash 的 benchmark 圖。
具體參考 github:https://github.com/Cyan4973/xxHash
點評區
說起 checksum,讓我想起來了計算機網絡原理,感覺是這門課中最多的一個詞 ????????????,TCP,UDP 包無不有 checksum,它的作用大多還是怕在網絡傳輸中由于干擾丟了一些字節,這樣 checksum 就能精準的發現,不過我記得 redis 的 xxx.rdb 文件中也是有 checksum 的, 這玩意真的太重要了。
總結
以上是生活随笔為你收集整理的NET问答: C# 中是否有最高效的方式对大文件做 checksum ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor 初探
- 下一篇: 云原生 | .NET 5 with Da