2015-12-02 63 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。