将HashBytes转换为VarChar

时间:2008-08-05 11:49:11

标签: sql sql-server

我想在SQL Server 2005中获取字符串值的MD5 Hash。我使用以下命令执行此操作:

SELECT HashBytes('MD5', 'HelloWorld')

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

是否有基于SQL的解决方案?

Yes

7 个答案:

答案 0 :(得分:138)

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

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

答案 1 :(得分:71)

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

答案 2 :(得分:30)

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

实际上fn_varbintohexstr内部调用了fn_varbintohexsubstringfn_varbintohexsubstring的第一个参数告诉它添加0xF作为前缀。 fn_varbintohexstr调用fn_varbintohexsubstring 1作为第一个参数internaly。

由于您不需要0xF,请直接致电fn_varbintohexsubstring

答案 3 :(得分:20)

David Knight所说的相反,这两个备选方案在MS SQL 2008中返回相同的响应:

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

所以看起来第一个是更好的选择,从2008版开始。

答案 4 :(得分:10)

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

(1表示将十六进制转换为字符串)

将其转换为lower并通过substring:

从字符串的开头删除0x
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

与将字节转换为字符串

后在C#中得到的完全相同

答案 5 :(得分:1)

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

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

答案 6 :(得分:-3)

将数据类型更改为varbinary似乎对我来说效果最好。