使用西班牙语单词时,SHA256 在 C# 和 SQL 服务器之间不会产生相同的结果
SHA256 doesn't yield same result between C# and SQL Server when using Spanish words
我正在使用 SHA256 来获取经过哈希处理的十六进制字符串。它在使用常规字符时工作正常,但是当要散列的字符串包含 accents/diacritics 时,我在 C# 和 T-SQL 中得到不同的结果。我更愿意在 SQL 服务器端进行更改。
- 匹配的示例单词:bird
- 不匹配的示例单词: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)
.NET、Windows 和 SQL 服务器使用 UTF16,而不是 UTF8。这两个片段正在散列不同的字节。当使用 same 编码时,哈希字符串是相同的。
这个:
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服务器的哈希字符串相同
我正在使用 SHA256 来获取经过哈希处理的十六进制字符串。它在使用常规字符时工作正常,但是当要散列的字符串包含 accents/diacritics 时,我在 C# 和 T-SQL 中得到不同的结果。我更愿意在 SQL 服务器端进行更改。
- 匹配的示例单词:bird
- 不匹配的示例单词: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)
.NET、Windows 和 SQL 服务器使用 UTF16,而不是 UTF8。这两个片段正在散列不同的字节。当使用 same 编码时,哈希字符串是相同的。
这个:
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服务器的哈希字符串相同