Gat*_*ler 120 sql sql-server
我想在SQL Server 2005中获取字符串值的MD5哈希值.我使用以下命令执行此操作:
SELECT HashBytes('MD5', 'HelloWorld')
但是,这会返回VarBinary而不是VarChar值.如果我尝试转换0x68E109F0F40CA72A15E05CC22786F8E6为VarChar há ðô§*à\Â'†øæ而不是68E109F0F40CA72A15E05CC22786F8E6.
有没有基于SQL的解决方案?
Gat*_*ler 140
我找到了其他解决方案:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
小智 77
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
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))
所以看起来第一个是从2008版开始的更好的选择.
小智 11
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1用于将十六进制转换为字符串)
将其转换为更低并通过子串从字符串的开头删除0x:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
与将字节转换为字符串后在C#中获得的完全相同