将 HashBytes 转换为 VarChar

我想得到 SQLServer2005中字符串值的 MD5散列。我用下面的命令做到这一点:

SELECT HashBytes('MD5', 'HelloWorld')

但是,这将返回 VarBinary 而不是 VarChar 值。如果我尝试将 0x68E109F0F40CA72A15E05CC22786F8E6转换成 VarChar,我得到的是 há ðô§*à\Â'†øæ而不是 68E109F0F40CA72A15E05CC22786F8E6

有基于 SQL 的解决方案吗?

是的

154006 次浏览

我在其他地方找到了解决办法:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

将数据类型更改为 varbinay 对我来说似乎是最好的方法。

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

使用 master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)代替 master.dbo.fn_varbintohexstr,然后使用 substringing得到结果。

事实上,fn_varbintohexstr在内部调用 fn_varbintohexsubstringfn_varbintohexsubstring的第一个参数告诉它是否添加 0xF作为前缀。fn_varbintohexstr调用 fn_varbintohexsubstring1作为内部的第一个参数。

因为您不需要 0xF,所以直接调用 fn_varbintohexsubstring

convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1用于将十六进制转换为字符串)

通过子字符串将其转换为 low 并从字符串的开头移除0x:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

与我们在 C # 中将字节转换为字符串后得到的结果完全相同

David Knight所说的相反,这两个替代方案在 MSSQL2008中返回相同的响应:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

因此,从2008版本开始,第一个版本似乎是更好的选择。

根据个人经验,在一个存储过程中使用下面的代码散列一个 SP 变量,我可以确认,虽然没有文档,这个组合工作100% ,如我的例子:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)