为什么在sql server中生成MD5哈希不相等?

时间:2014-03-12 13:43:51

标签: c# sql-server hash md5

我在SQL Server 2008 R2中有一个包含两个字段(WordHash,Word)的表。在C#中生成此Hash字段,我需要为sql server中的Word字段重新生成哈希码。

但我的问题是在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在使用相同代码生成时有所不同!?

1 个答案:

答案 0 :(得分:17)

问题是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