2015-12-02 64 views
-2

這兩個代碼塊是否會返回相同的內容?假設arr是在這兩個例子中的相同byte[]SHA256.Create()和HashAlgorithm.Create(「SHA-256」)是否有區別?

代碼示例1

HashAlgorithm a = HashAlgorithm.Create("SHA-256"); 
var result = a.ComputeHash(arr); 

代碼示例2

SHA256 b = SHA256.Create(); 
var result = b.ComputeHash(arr); 

UPDATE: 我有樣件生成的項目C#中的AWS簽名代碼(用.Net 4.5編寫)和a m試圖在dotnetcode5項目中使用它的類,並且僅僅因爲dotnetcode5中沒有HashAlgorithm.Create(),我決定使用第二種方法而不是第一種方法。問題在於第二個示例返回一個在AWS中無效的規範結果。

+1

因此,您應該問*爲什麼*這兩個片段之間存在差異,而不是*是否存在差異,根據您對第一個答案的評論來判斷。 –

+0

你如何比較你的字節數組? – Rohit

回答

0

兩者都將導致相同,因爲DO調用相同的方法在內部

new static public SHA256 Create() { 
    return Create("System.Security.Cryptography.SHA256"); 
} 

new static public SHA256 Create(String hashName) { 
    return (SHA256) CryptoConfig.CreateFromName(hashName); 
} 

static public HashAlgorithm Create(String hashName) { 
    return (HashAlgorithm) CryptoConfig.CreateFromName(hashName); 
} 

的差被剛返回類型(SHA256HashAlgorithm派生)

Reference for SHA256Reference for HashAlgorithm

1

我認爲OP缺少的主要問題是如何比較兩個字節數組。

如果你做這樣的事情:

static void Main(string[] args) 
    {   
     byte[] arr = Encoding.ASCII.GetBytes("sample"); 
     HashAlgorithm a = HashAlgorithm.Create("SHA-256"); 
     var resulthash = a.ComputeHash(arr); 

     SHA256 b = SHA256.Create(); 
     var resultsha = b.ComputeHash(arr); 

     Console.WriteLine(StructuralComparisons.StructuralEqualityComparer.Equals(resulthash, resultsha)); 
    }  

你會得到正確的響應。

請注意,您不能執行類似resulthash==resultsha的操作,該操作將返回false。