我在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
在使用相同代码生成时有所不同!?
答案 0 :(得分:17)
问题是NVARCHAR
和VARCHAR
被散列到不同的值。 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