You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL Server中HASHBYTES命令对以下代码返回不同结果?

为什么HASHBYTES('MD5')返回不同结果?

先看你贴的代码和执行结果:

Declare @Pass nvarchar 
set @Pass='SampleHash' 
Select HASHBYTES('MD5',@Pass) 
Select HASHBYTES('MD5','SampleHash') 

返回结果:

0x6F0AC8C187CEDB835A9BA373603BDA3F 
0xC205AF5CE2048FF5C8C9A5B5ABDAF64E 

这其实是个很容易踩的SQL Server细节坑——你声明@Pass变量时没指定nvarchar的长度!

在SQL Server里,如果你声明nvarchar类型变量却不写长度,默认长度是1。也就是说,当你给@Pass赋值'SampleHash'的时候,变量只能存下第一个字符N'S'(因为是nvarchar类型,会以UTF-16编码存储)。而第二个HASHBYTES是直接对完整的'SampleHash'字符串(默认是varchar类型,以ASCII类编码存储)做哈希,两者处理的内容根本不是一回事,结果当然不一样。

要解决这个问题,只要声明变量时指定足够的长度就行,比如:

Declare @Pass nvarchar(50) -- 明确指定长度,确保能存下完整字符串
set @Pass='SampleHash' 
Select HASHBYTES('MD5',@Pass) 
Select HASHBYTES('MD5',N'SampleHash') -- 要是想让两次结果一致,字符串常量要加N前缀,和变量编码对齐

这样两次哈希的就是同一个完整字符串,结果就会相同了。

内容的提问来源于stack exchange,提问作者Kh.N.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:31