public static async Task<string> CalculateMD5Hash(string sFilePath) { using (MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider()) { byte[] hashvalue; // TODO Test perf of different buffer sizes, particularly for different file sizes (e.g. 10kb, 150kb, 500kb, 1mb, 5mb, 20mb, 50mb, 150mb, 500mb, 1gb, 2gb) using (var stream = new BufferedStream(File.OpenRead(sFilePath), 1200000)) { // TODO Verify that async change is necessary (or maybe should be on buffered file load instead, with the following line removed?) await stream.FlushAsync(); hashvalue = hasher.ComputeHash(stream); } return System.BitConverter.ToString(hashvalue); } }