sql server中生成的MD5哈希值不相等

本文关键字:MD5 哈希值 不相等 server sql | 更新日期: 2023-09-27 17:49:47

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

但是我的问题是生成MD5哈希在sql server和c#是不同的。我找到下面的代码来解决这个问题,但我仍然有同样的问题。

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是不同的,而他们从相同的代码生成!?

sql server中生成的MD5哈希值不相等

问题是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或使用NVARCHAR的值重新计算[WordHash]

一些有用的进一步阅读:比较SQL Server HASHBYTES函数和。net哈希