题
我想要得到的MD5Hash of a string value in SQL服务器2005年。我这样做以下命令:
SELECT HashBytes('MD5', 'HelloWorld')
然而,这返回VarBinary而不是VarChar值。如果我试图转换 0x68E109F0F40CA72A15E05CC22786F8E6
成VarChar我 há ðô§*à\Â'†øæ
而不是的 68E109F0F40CA72A15E05CC22786F8E6
.
是否有任何基于SQL的解决方案吗?
解决方案
我已经找到了解决方案其他地方:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
其他提示
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_varbintohexsubstring
内部。第一个参数的 fn_varbintohexsubstring
告诉它加入 0xF
作为前缀或没有。 fn_varbintohexstr
电话 fn_varbintohexsubstring
与 1
作为第一个参数internaly.
因为你不需要 0xF
, 叫 fn_varbintohexsubstring
直接。
相反的是 大卫*奈特 说,这两个替代办法的返回同样的响应在MS SQL2008年:
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
因此它看起来象第一个是更好的选择,开始从版,2008年。
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1转换hexadecimal string)
转换成本降低和消除0x从一开始的串通过substring:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
完全一样的,为什么我们得到在C#后转换为字节串
与个人的经验的使用下列中的代码存储程序哈希SP变我可以确认,虽然无证件,这种组合的工作100%的按我的例子:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
变化的数据类型来varbinary似乎最好的工作对我来说。