C# SHA256.Create()和HashAlgorithm.Create(“SHA-256”)之间有什么区别吗?

C# SHA256.Create()和HashAlgorithm.Create(“SHA-256”)之间有什么区别吗?,c#,cryptography,sha256,hashalgorithm,C#,Cryptography,Sha256,Hashalgorithm,这两个代码块是否返回相同的内容?假设两个示例中的arr都是相同的字节[]: 代码示例1 代码示例2 更新: 我得到了用C语言创建AWS签名代码的示例项目,它是用.NET4.5编写的,我试图在dotnetcode5项目中使用它的类,只是因为HashAlgorithm.Create在dotnetcode5中还不可用,我决定使用第二种方法,而不是第一种方法。问题在于,第二个示例返回的规范结果在AWS中无效。SHA256。Create在内部执行此操作: return (HashAlgorithm) Cr

这两个代码块是否返回相同的内容?假设两个示例中的arr都是相同的字节[]:

代码示例1

代码示例2

更新: 我得到了用C语言创建AWS签名代码的示例项目,它是用.NET4.5编写的,我试图在dotnetcode5项目中使用它的类,只是因为HashAlgorithm.Create在dotnetcode5中还不可用,我决定使用第二种方法,而不是第一种方法。问题在于,第二个示例返回的规范结果在AWS中无效。

SHA256。Create在内部执行此操作:

return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");
HashAlgorithm.CreateSHA-256将导致以下结果:

return (SHA256) CryptoConfig.CreateFromName("SHA-256");
这两个调用都将导致创建的实例


因此,这两种方法之间没有区别。

两者的结果相同,因为do在内部调用相同的方法

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

new static public SHA256 Create(String hashName) {
    return (SHA256) CryptoConfig.CreateFromName(hashName);
}
区别在于返回类型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 ));
    }     
你会得到正确的回答


请注意,您不能执行返回false的resulthash==resultsha之类的操作。

因此,您似乎应该询问这两个代码段之间为什么存在差异,而不是根据您对第一个答案的评论判断是否存在差异。您如何比较字节数组?
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);
}
    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 ));
    }