[解決済み] C#で大きなファイルのチェックサムを作成する最速の方法は何ですか?
2022-06-24 22:20:05
質問
いくつかのマシン間で大きなファイルを同期する必要があります。ファイルのサイズは最大で 6GB です。同期は、数週間ごとに手動で行われます。ファイル名はいつでも変更できるため、ファイル名を考慮することはできません。
私の計画は、宛先 PC とソース PC でチェックサムを作成し、次に、宛先にまだ存在しないチェックサム付きのすべてのファイルを宛先にコピーすることです。 私の最初の試みは、このようなものでした。
using System.IO;
using System.Security.Cryptography;
private 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,6 GB のファイル -> 20 分。
- MD5 で 1,6 GB のファイル -> 6.15 分
チェックサムを得るためのより良い - より速い - 方法はありますか(たぶん、より良いハッシュ関数で)?
どのように解決するのですか?
ここで問題となるのは
SHA256Managed
は一度に 4096 バイトを読み取ります (これは
FileStream
をオーバーライドし
Read(byte[], int, int)
をオーバーライドして、ファイルストリームからどれだけ読み込んだかを確認します)、これはディスクIOには小さすぎるバッファです。
スピードアップするために (私のマシンでは 2GB のファイルを SHA256 でハッシュするのに2分、MD5 でハッシュするのに1分) ラップ
FileStream
を
BufferedStream
で、適度な大きさのバッファサイズを設定します (私は ~1 Mb のバッファで試してみました)。
// Not sure if BufferedStream should be wrapped in using block
using(var stream = new BufferedStream(File.OpenRead(filePath), 1200000))
{
// The rest remains the same
}
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#で四捨五入する方法
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。