为何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.
相关产品推荐
相关产品推荐

