2011-03-17 92 views
2

我正在尝试使用T-SQL来计算SHA1 unicode字符串的哈希值。下面的代码工作正常ASCII字符串:使用T-SQL计算'nvarchar'字符串的SHA1哈希值

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

但它计算错误的哈希,当我更换的第一行代码与declare @input nvarchar(50)

Calculated hash (nvarchar): BBA91B680CE2685E9465DE24967E425CF055B10F 
Calculated hash by a tool : 37AA63C77398D954473262E1A0057C1E632EDA77 

如何计算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; 
} 

回答

6

你确定你的工具返回的哈希值是使用UTF16或Unicode编码时您将它与SQL Server返回的数据进行比较?... SHA1(以及其他编码格式)取决于数据类型,因此在作为输入提供时应该返回不同的值。请参阅this链接以获取更详细的解释。

+0

请参阅编辑请 – Xaqron 2011-03-17 21:09:13

+1

谢谢,有用的链接。正如文章所描述的那样,这是一个带有'HashBytes'的已知错误。现在我可以理解为什么微软不擅长采用国际标准;当同一公司的两个团队根据输入**数据类型**计算散列值(SQL vs .NET)时,它们会有所不同。 – Xaqron 2011-03-17 21:56:17

+0

@Xaqron:是的,正是.....很高兴链接帮助你。 – Lamak 2011-03-17 22:19:21