这两个代码块返回相同的东西吗?假设arr
在两个示例中都是相同的byte[]
:
代码示例1
HashAlgorithm a = HashAlgorithm.Create("SHA-256");
var result = a.ComputeHash(arr);
代码示例2
SHA256 b = SHA256.Create();
var result = b.ComputeHash(arr);
更新:我得到了在C#中创建AWS签名代码的示例项目(用.Net 4.5编写),并试图在dotnetcode5项目中使用它的类,因为HashAlgorithm.Create()
在dotnetcode5中还不可用,所以我决定使用第二种方法而不是第一种方法。问题是第二个例子返回了一个在AWS中无效的规范结果。
SHA256.Create()
在内部执行此操作:
return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");
HashAlgorithm.Create("SHA-256")
将导致以下情况:
return (SHA256) CryptoConfig.CreateFromName("SHA-256");
这两个调用都将导致创建SHA256Managed
的实例。
请参阅https://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptoconfig(v=vs.110).aspx#Anchor_5
因此,这两种方法没有区别。
两者的结果相同,因为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);
}
区别只是返回类型(SHA256
源自HashAlgorithm
)
SHA256的参考,HashAlgorithm 的参考
我认为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的操作。