日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

NET问答: C# 中是否有最高效的方式对大文件做 checksum ?

發布時間:2023/12/4 C# 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。