2012-11-06 64 views
3

我使用System.Security.Cryptography.MD5從字符串和包含相同字符串的文件生成MD5哈希。然而哈希值不同。爲什麼MD5哈希For FileStream和字符串不同C#

這裏是從字符串

byte[] data = Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog"); 
byte[] hash = MD5.Create().ComputeHash(data); 
return BitConverter.ToString(hash).Replace("-", "").ToLower(); 

生成的代碼,這裏是代碼的時候我生成該文件的哈希

internal static string CalculateFileHashTotal(string fileLocation) 
    { 
     using(var md5 = MD5.Create()) 
     { 
      using (var stream = File.OpenRead(fileLocation)) 
      { 
       byte[] b = md5.ComputeHash(stream); 
       stream.Close(); 
       return BitConverter.ToString(b).Replace("-", "").ToLower(); 
      } 
     } 
    } 

從字符串哈希是正確的,所以我假設文件中的Hash讀取一些額外的東西或不讀取整個文件。我無法在Google上找到答案。

任何想法?

+0

爲了提高哈希的性能,比如'VAR流=新BufferedStream一個BufferedStream包裹流( File.OpenRead(path),100000)' – Luuk

回答

6

哈希因數據不同而不同。

該文件是UTF-8,而不是ASCII,那麼你應該使用UTF-8編碼字符串轉換爲字節,以獲得相同的結果:

byte[] data = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog"); 

此外,文件可能包含一個BOM (byte order mark)在開始時。這包含在數據中,因爲文件不被讀爲文本。

添加UTF-8 BOM的數據的開始會給出相同的散列:

byte[] bom = { 239, 187, 191 }; 
byte[] data = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog"); 

byte[] bomdata = new byte[bom.Length + data.Length]; 
bom.CopyTo(bomdata, 0); 
data.CopyTo(bomdata, bom.Length); 
byte[] hash = MD5.Create().ComputeHash(bomdata); 
+0

謝謝。這就像你說的那樣。現在的實際問題是要找出客戶端如何檢查文件散列。 – SneakyPeet

-1

您是否修剪了文件中的空白字符串和新行?