SHA256.Create() 和 HashAlgorithm.Create("SHA-256") 有区别吗?
Is there any difference between SHA256.Create() and HashAlgorithm.Create("SHA-256")?
这两个代码块return是一回事吗?假设 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 中还不可用,我决定使用第二种方法而不是第一种方法。问题是第二个示例 return 是一个规范结果 在 AWS 中无效。
SHA256.Create()
在内部执行此操作:
return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");
HashAlgorithm.Create("SHA-256")
将导致:
return (SHA256) CryptoConfig.CreateFromName("SHA-256");
这两个调用都会导致创建 SHA256Managed
.
的实例
所以这两种方法没有区别。
两者的结果相同,因为 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);
}
区别只是 return 类型(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
的操作,那样会 return 错误。
这两个代码块return是一回事吗?假设 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 中还不可用,我决定使用第二种方法而不是第一种方法。问题是第二个示例 return 是一个规范结果 在 AWS 中无效。
SHA256.Create()
在内部执行此操作:
return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");
HashAlgorithm.Create("SHA-256")
将导致:
return (SHA256) CryptoConfig.CreateFromName("SHA-256");
这两个调用都会导致创建 SHA256Managed
.
所以这两种方法没有区别。
两者的结果相同,因为 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);
}
区别只是 return 类型(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
的操作,那样会 return 错误。