当前位置:首页> 正文

关于sql:将HashBytes转换为VarChar

关于sql:将HashBytes转换为VarChar

Convert HashBytes to VarChar

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

1
SELECT HashBytes('MD5', 'HelloWorld')

但是,这将返回VarBinary而不是VarChar值。 如果我尝试将0x68E109F0F40CA72A15E05CC22786F8E6转换为VarChar,则会得到há e?§*à\\?'???而不是68E109F0F40CA72A15E05CC22786F8E6

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


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

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


1
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_varbintohexstr1作为内部第一个参数调用fn_varbintohexsubstring

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


与David Knight所说的相反,这两种选择在MS SQL 2008中返回相同的响应:

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

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


1
CONVERT(VARCHAR(34), HASHBYTES('MD5','Hello World'),1)

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

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

1
SUBSTRING(LOWER(CONVERT(VARCHAR(34), HASHBYTES('MD5','Hello World'),1)),3,32)

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


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

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

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


展开全文阅读

相关内容