2014-03-12 120 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