使用T-SQL计算'nvarchar'字符串的SHA1哈希值

Xaq*_*ron 2 t-sql hash nvarchar

我正在尝试SHA1使用T-SQL 计算unicode字符串的哈希值.以下代码适用于ASCII字符串:

declare @input varchar(50)
set @input = 'some text'
print 'SHA1 Hash: ' + UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0))
Run Code Online (Sandbox Code Playgroud)

但是当我用第一行代码替换时,它会计算错误的哈希值declare @input nvarchar(50).

Calculated hash (nvarchar): BBA91B680CE2685E9465DE24967E425CF055B10F
Calculated hash by a tool : 37AA63C77398D954473262E1A0057C1E632EDA77
Run Code Online (Sandbox Code Playgroud)

如何计算a的SHA1哈希值nvarchar

[编辑]:

下面的C#代码生成与我用于散列的工具相同的散列:

// Computes SHA1 hash of a given string
string ComputeHash(string input)
{
    string result = string.Empty;
    byte[] hash;
    byte[] bytes = Encoding.GetBytes(input);

    using (var sha = SHA1Managed.Create())
        hash = sha.ComputeHash(bytes);

    foreach (var b in hash)
        result += b.ToString("X2");

    return result;
}
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 6

UTF16当您将它与SQL Server返回的那个进行比较时,您确定您的工具返回的哈希值是使用还是Unicode编码?... SHA1(和其他编码格式)取决于数据类型,因此它应该在给定时返回不同的值作为输入.请查看链接以获取更详细的说明.

  • 实际上这不是一个错误,因为文章声明差异是基于您传递给HashBytes的数据类型以及您用来将字符串转换为.net中的字节的编码.如果你使用相同的 - 例如使用`nvarchar`和`Encoding.GetEncoding("utf-16").GetBytes(value)`或者使用`varchar`和`Encoding.GetEncoding("utf-8").GetBytes(value )` - 然后你应该得到相同的结果. (2认同)