为何使用CONCAT时有无convert得到的HashBytes结果不同?
为什么两个HashBytes的MD5结果不同?
核心原因是两个查询传入HashBytes的原始字节流完全不一样,根源在于字符串的编码类型差异:
- 第一个查询中,
convert(nvarchar,100)将数字100转换成了**nvarchar(Unicode编码)**字符串。Unicode字符串的每个字符占用2字节,拼接后的整个字符串A1001234会以双字节形式存储,比如字符'A'的字节是0x4100,数字'1'是0x3100,以此类推。 - 第二个查询中,所有拼接的内容都是**varchar(非Unicode编码)**字符串,每个字符仅占用1字节。同样的
A1001234会以单字节形式存储,字符'A'是0x41,数字'1'是0x31,字节流和第一个查询完全不同。
HashBytes函数是基于输入的原始字节序列计算哈希值的,只要输入的字节流有任何差异,最终生成的哈希结果就会不同。
你可以通过CONVERT(varbinary, ...)直观查看两种字符串的字节差异:
-- 查看Unicode版本的字节流 SELECT CONVERT(varbinary, CONCAT('A',convert(nvarchar,100),'1234')) AS unicode_bytes; -- 查看非Unicode版本的字节流 SELECT CONVERT(varbinary, CONCAT('A','100','1234')) AS non_unicode_bytes;
执行后会看到两者的字节序列完全不同,这就是哈希结果不一样的直接原因。
内容的提问来源于stack exchange,提问作者user3579222
相关产品推荐
相关产品推荐

