2014-03-24 112 views
1

對於我見過的一些人來說,這是一個問題,但大多數人都是關於文本導入問題。這是一個純粹的二元問題。這裏是一些示例代碼。MD5 computeHash(Stream)和computeHash(byte [])之間的區別

MD5 md5Bytes = MD5.Create() ; 
MD5 md5Stream = MD5.Create() ; 
var random = new Random(); 

var bytes  = new byte[ 4096*2 ] ; 
random.NextBytes(bytes);  
var stream = new MemoryStream(bytes) ; 

stream.Position = 0 ; 

var bytesHash = md5Bytes.ComputeHash(bytes); 
var streamHash = md5Stream.ComputeHash(stream); 

for (int i = 0; i < bytesHash.Length; ++i) 
    if (bytes[i] != streamHash[i]) 
    { 
    Console.WriteLine("Different content " + i); 
    break; 
    } 

當我運行這個,令我驚訝,我得到不同的結果。有人可以解釋一下這裏發生了什麼不應該是一個字節數組的MD5給出相同的結果作爲一個相同的內容流?

+3

誘惑,關閉此爲題外話,由於它只是作爲一個錯字。我會*強烈*鼓勵你總是把大括號放在for循環中,即使當body只是一個單獨的語句。 –

+0

這是調試如何解決問題的一個很好的例子。如果你在VS中有一個斷點而不是編寫代碼來完成它,那麼查看正確的變量會更容易。 –

回答

8

你正在比較數據到散列,所以當然不一樣;比較應該是:

if (bytesHash[i] != streamHash[i]) 

而現在給出相同的結果,符合市場預期;)