我想要得到的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_varbintohexsubstring1 作为第一个参数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似乎最好的工作对我来说。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top