2013-08-06 115 views
1

使用以下代碼,無論輸入如何,我都會得到相同的哈希值。任何想法,爲什麼這可能是?使用Microsoft SHA256的所有哈希值都是相同的

private static SHA256 sha256; 
    internal static byte[] HashForCDCR(this string value) 
    { 
     byte[] hash; 
     using (var myStream = new System.IO.MemoryStream()) 
     { 
      using (var sw = new System.IO.StreamWriter(myStream)) 
      { 
       sw.Write(value); 
       hash = sha256.ComputeHash(myStream); 
      } 
     } 

     return hash; 
    } 

回答

3

您計算流的空部分(一個立即的內容後,您sw.Write寫的),所以它總是相同的哈希值。

便宜修復:sw.Flush();myStream.Position = 0;。更好的解決方法是基於原始數據流進行加密寫完,創造新的只讀流:

using (var myStream = new System.IO.MemoryStream()) 
{ 
    using (var sw = new System.IO.StreamWriter(myStream)) 
    { 
     sw.Write(value); 
    } 
    using (var readonlyStream = new MemoryStream(myStream.ToArray(), writable:false) 
    { 
     hash = sha256.ComputeHash(readonlyStream); 
    } 
} 
+0

這給出了錯誤「無法訪問封閉的流。」在ComputeHash行上。第三條使用聲明最後還需要另一個「)」。 – Jacob

+0

「廉價修復」的工作非常好。 – Jacob

+0

@OPOSJacob應該是新的流 - 樣本已修復。 –

1

您可能需要刷新流。爲了獲得最佳性能,StreamWriter不會立即寫入流。它等待其內部緩衝區填滿。立即刷新作者,將內部緩衝區的內容刷新到下劃線流中。

 sw.Write(value); 
    sw.Flush(); 
    myStream.Position = 0; 
    hash = sha256.ComputeHash(myStream); 
+0

好吧,我試過了。它沒有任何區別。 – Jacob

+0

您需要按照以下建議設置myStream.Position = 0。我編輯了我的答案以反映這一點。 – nhrobin

+0

是的,改變它的效果很好 – Jacob

0

我可能會使用阿列克謝Levenkov稱爲「廉價修復」的解決方案。但是,我沒有遇到一個其他的方式,使其工作,我將張貼未來的讀者:

var encoding = new System.Text.UTF8Encoding(); 
var bytes = encoding.GetBytes(value); 
var hash = sha256.ComputeHash(bytes); 
return hash; 

雅各