使用西班牙语单词时,SHA256 在 C# 和 SQL Server 之间不会产生相同的结果

De *_*nte 4 c# sql-server sha256 hashbytes

我正在使用 SHA256 来获取散列的十六进制字符串。使用常规字符时它工作得很好,但是当要散列的字符串包含重音符号/变音符号时,我在 C# 和 T-SQL 中会得到不同的结果。我更愿意在 SQL Server 端进行更改。

\n\n
    \n
  • 匹配的示例单词:bird
  • \n
  • 不匹配的示例单词:MU\xc3\x91OZ
  • \n
\n\n

C#

\n\n
using (SHA256 sha2 = SHA256.Create())  \n{\n    var hash = sha2.ComputeHash(Encoding.UTF8.GetBytes(fullAddress));\n    string hexString = string.Empty;\n\n    for (int i = 0; i < hash.Length; i++)\n    {\n        hexString += hash[i].ToString("X2"); //Convert the byte to Hexadecimal representation, Notice that we use "X2" instead of "X"\n    }\n\n    sha2.Dispose();\n    return hexString;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

SQL

\n\n
declare @fullAddress nvarchar(500)\nset @fullAddress = \'MU\xc3\x91OZ\'\nselect CONVERT([varchar](256), HASHBYTES(\'SHA2_256\', @fullAddress), 2) \n
Run Code Online (Sandbox Code Playgroud)\n

Pan*_*vos 6

.NET、Windows 和 SQL Server 使用 UTF16,而不是 UTF8。这两个片段对不同的字节进行哈希处理。当使用相同的编码时,哈希字符串是相同的。

\n\n

这 :

\n\n
using (var sha2 = System.Security.Cryptography.SHA256.Create())  \n{\n    var hash = sha2.ComputeHash(Encoding.Unicode.GetBytes("MU\xc3\x91OZ"));\n    {\n        string hexString = string.Empty;\n\n        for (int i = 0; i < hash.Length; i++)\n        {\n            hexString += hash[i].ToString("X2");\n        }\n        Console.WriteLine(hexString);        \n    }    \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产:

\n\n
276DB000BF524070F106A2C413942159AB5EF2F5CA5A5B91AB2F3B6FA48EE1ED\n
Run Code Online (Sandbox Code Playgroud)\n\n

与 SQL Server 的哈希字符串相同

\n