【问题标题】:Why generated MD5 hash in sql server are not equal? [duplicate]为什么sql server中生成的MD5 hash不相等? [复制]
【发布时间】:2014-04-16 16:49:42
【问题描述】:

我在 SQL Server 2008 R2 中有一个表,其中包含两个字段(WordHash、Word)。这个Hash字段是用C#生成的,我需要为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 是不同的,而它们是从相同的代码生成的!?

【问题讨论】:

  • 如果你使用N'some word' 而不是'some word',结果会不会一样?
  • 这只是一个猜测,但我怀疑'Analytics' 文字和[Word] 值使用不同的编码处理,这可能确实会在哈希输出中产生差异。一个可能是 unicode,而另一个不是。
  • @ScottChamberlain 你说得对:)。您可以发布一些链接以了解发生这种情况的原因吗?
  • @ScottChamberlain - 这个问题比您标记为重复的其他问题更早提出。我想另一个问题应该比这个问题标记为重复。
  • @Abhishekkumar 这不是这个网站的运作方式,它不是“最老的获胜”,而是“最好的获胜”。我找到了另一个问题,我记得在这里回答了相同的问题,我将其标记为重复,以将未来的访问者指向更好、更新的问题和答案。看到元讨论“Should I vote to close a duplicate question, even though it's much newer, and has more up to date answers?”,cons 是:不,你应该关闭旧的。

标签: c# sql-server hash md5


【解决方案1】:

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

一些有用的延伸阅读:Comparing SQL Server HASHBYTES function and .Net hashing

【讨论】:

  • 成功了。谢谢斯科特 :-)
  • 将查询代码更改为:convert(nvarchar(32),HASHBYTES('MD5', convert(varchar(32),[Word])),2) AS MyHash 并且有效。
  • 你拯救了我们的一天。
猜你喜欢
  • 2019-06-24
  • 1970-01-01
  • 2014-04-04
  • 2016-02-20
  • 2020-03-02
  • 2013-03-08
  • 2021-03-18
  • 2013-02-10
  • 1970-01-01
相关资源
最近更新 更多