将HashBytes转换为VarChar

Gat*_*ler 120 sql sql-server

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

SELECT HashBytes('MD5', 'HelloWorld')
Run Code Online (Sandbox Code Playgroud)

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

有没有基于SQL的解决方案?

Gat*_*ler 140

我找到了其他解决方案:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Run Code Online (Sandbox Code Playgroud)

  • fn_varbintohexstr没有记录功能.使用CONVERT(Char,@ value,2) (16认同)
  • CONVERT()在SQL 2005中不起作用.如果您使用的是SQL 2008或更高版本,则可以使用CONVERT().遗憾的是,我不知道一个适用于所有SQL版本的命令,因此要么在脚本中进行一些疯狂的版本检查,要么只是在某个地方做一个注释,如果升级SQL版本需要修复该函数. (4认同)
  • CONVERT(Char,@ value,2)只输出32个字节 - 如果你对sha1哈希进行截断,你将截断它,你需要转换(char(48),@ value,2)来保持适当的输出. (4认同)

小智 77

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于SQL Azure.对于SHA1:SELECT CONVERT(VARCHAR(40),HashBytes('SHA1','Hello World'),2) (4认同)
  • 无需不必使用nvarchar. (4认同)
  • 问题陈述SQL Server 2005,如果你在其中做了上述任何一个建议(也可能是其他任何版本),他们就不会做出要求.你可以获得字节等价的任何字符,而不是字符串作为十六进制字符串.GateKiller和Xarqron给出了有效的答案. (3认同)

Xaq*_*ron 30

使用master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)而不是结果master.dbo.fn_varbintohexstr然后substringing使用结果.

事实上,内部fn_varbintohexstr呼叫fn_varbintohexsubstring.第一个参数fn_varbintohexsubstring告诉它添加0xF为前缀或不.用internaly作为第一个参数fn_varbintohexstr调用.fn_varbintohexsubstring1

因为您不需要0xF,fn_varbintohexsubstring直接致电.


小智 25

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))
Run Code Online (Sandbox Code Playgroud)

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


小智 11

convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
Run Code Online (Sandbox Code Playgroud)

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

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

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
Run Code Online (Sandbox Code Playgroud)

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