sql -将HashBytes转换为VarChar

Translate

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

SELECT HashBytes('MD5', 'HelloWorld')

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
来源
Translate
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
来源
Translate

采用master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)代替master.dbo.fn_varbintohexstr接着substringing结果。

事实上fn_varbintohexstr来电fn_varbintohexsubstring内部。第一个论点fn_varbintohexsubstring告诉它添加0xF是否为前缀。fn_varbintohexstr来电fn_varbintohexsubstring1作为第一个内部参数。

因为你不需要0xF,致电fn_varbintohexsubstring直。

来源
Translate

与什么相反大卫·奈特说,这两种选择在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版开始,第一个似乎是一个更好的选择。

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

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

将其转换为较低的值,并通过子字符串从字符串的开头删除0x:

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

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

来源
Translate

根据在存储过程中使用以下代码的个人经验,该代码对SP变量进行了哈希处理,我可以确认(虽然没有记录),但根据我的示例,此组合的工作效果为100%:

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

将数据类型更改为varbinary似乎最适合我。

来源