2011-03-17 96 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