2014-03-12 156 views
10

我有一個SQL Server 2008 R2中包含兩個字段(WordHash,Word)的表。在C#中生成這個Hash字段,我需要在sql server中重新生成Word字段的哈希碼。爲什麼在sql server中生成的MD5哈希不相等?

但我的問題是,在sql server和C#中生成的MD5哈希是不同的。我發現下面的代碼來解決這個問題,但我仍然有同樣的問題。

SQL代碼:

CONVERT(NVARCHAR(32),HASHBYTES('MD5', 'some word'), 2) 

把這個代碼塊到我的查詢後,我看到一些有線的結果!這是我的結果:
我的查詢:

SELECT 
    [WordHash], 
    convert(nvarchar(32),HASHBYTES('MD5', 'Analytics'),2) AS TestHash, 
    convert(nvarchar(32),HASHBYTES('MD5', [Word]),2) AS SqlHash 
FROM myTable 

結果:

WordHash: A768CAA988605A2846599CF7E2D0C26A 
TestHash: A768CAA988605A2846599CF7E2D0C26A 
SqlHash F4AFA5FEF805F7F5163EC6402BAF61FF 

注意,'Analytics'在數據庫中的記錄數據中的一個。
爲什麼TestHash & SqlHash不同,而他們從相同的代碼生成!?

+4

如果你'N'some word'',而不只是''一些word''做的結果變成一樣嗎? –

+0

這只是一個猜測,但我懷疑''Analytics''文字和'[Word]'值是用不同的編碼處理的,這可能確實會在散列輸出中產生差異。一個可能是unicode,而另一個不是。 – David

+0

@ScottChamberlain你絕對正確:)。你可以發佈一些鏈接,以瞭解爲什麼發生這種情況? –

回答

15

問題是NVARCHARVARCHAR被哈希到不同的值。 HASHBYTES('MD5', 'Analytics'),[WordHash]都是VARCHAR值的散列值,但[Word]NVARCHAR

select HASHBYTES('MD5', 'Analytics'), 'varchar' 
union 
select HASHBYTES('MD5', N'Analytics'), 'nvarchar' 

--outputs 
------------------------------------- -------- 
0xA768CAA988605A2846599CF7E2D0C26A varchar 
0xF4AFA5FEF805F7F5163EC6402BAF61FF nvarchar 

爲了解決這個問題,必須要麼改變[Word]VARCHAR或重新計算[WordHash]使用NVARCHAR值是。

一些有用的進一步閱讀:Comparing SQL Server HASHBYTES function and .Net hashing

+0

它的工作。謝謝Scott :-) – Mojtaba

+2

將查詢代碼更改爲:convert(nvarchar(32),HASHBYTES('MD5',convert(varchar(32),[Word])),2)AS MyHash' and It's works。 – Mojtaba

+1

你節省了我們的一天。 – SSS