2

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

  • 匹配的示例词:鸟
  • 不匹配的示例词:MUÑOZ

C#

using (SHA256 sha2 = SHA256.Create())  
{
    var hash = sha2.ComputeHash(Encoding.UTF8.GetBytes(fullAddress));
    string hexString = string.Empty;

    for (int i = 0; i < hash.Length; i++)
    {
        hexString += hash[i].ToString("X2"); //Convert the byte to Hexadecimal representation, Notice that we use "X2" instead of "X"
    }

    sha2.Dispose();
    return hexString;
}

SQL

declare @fullAddress nvarchar(500)
set @fullAddress = 'MUÑOZ'
select CONVERT([varchar](256), HASHBYTES('SHA2_256', @fullAddress), 2) 
4

1 回答 1

4

.NET、Windows 和 SQL Server 使用 UTF16,而不是 UTF8。这两个片段正在散列不同的字节。当使用相同的编码时,哈希字符串是相同的。

这 :

using (var sha2 = System.Security.Cryptography.SHA256.Create())  
{
    var hash = sha2.ComputeHash(Encoding.Unicode.GetBytes("MUÑOZ"));
    {
        string hexString = string.Empty;

        for (int i = 0; i < hash.Length; i++)
        {
            hexString += hash[i].ToString("X2");
        }
        Console.WriteLine(hexString);        
    }    
}

生产:

276DB000BF524070F106A2C413942159AB5EF2F5CA5A5B91AB2F3B6FA48EE1ED

与 SQL Server 的哈希字符串相同

于 2019-07-11T15:46:48.007 回答