私は現在、過度のメモリプレッシャーを引き起こすファイルをハッシュする必要があるという問題に直面しており、ファイルストリームを使用してその場でハッシュを作成できるかどうかを調べようとしています。
可能性を調査している間、私は簡単な小さなテストを作成し、MD5のComputeHashが文字列とストリームを受け取るメソッド呼び出し間で同じハッシュを返すことを確認することにしました。
let CreateMD5HashFromString (value: string) =
Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(value)))
let CreateMD5HashFromStream (value: Stream) =
Convert.ToBase64String(MD5.Create().ComputeHash(value))
次の単体テストで通話をテストしています。
[<TestMethod>]
member this.``CreateMD5Hash is the same between a string and a file stream`` () =
let sampleText = File.ReadAllText("Sample.txt")
let textMD5 = Security.CreateMD5HashFromString(sampleText);
let streamMD5 = Security.CreateMD5HashFromStream(File.OpenRead("Sample.txt"))
Assert.AreEqual(textMD5, streamMD5)
テスト用の小さなサンプルファイルを読み取っています。生成されたハッシュが異なるため、このテストは失敗します。私にはこれは正しくないように見えますが、正確にはわかりません。これらが同じであるべきかどうか誰かが確かに知っていますか?
また、2番目の質問ですが、ComputeHashのストリーム過負荷を使用してメモリの問題を節約していますか、それともハッシュする前にストリーム全体をロードしますか?関連する.NETアセンブリを分解しようとしましたが、HashCoreが内部で何をしているのかを追跡しようとして迷子になりました。