将HashBytes转换为VarChar

我想在SQL Server 2005中获得一个string值的MD5哈希值。我用下面的命令来做到这一点:

SELECT HashBytes('MD5', 'HelloWorld') 

但是,这将返回一个VarBinary而不是一个VarChar值。 如果我试图将0x68E109F0F40CA72A15E05CC22786F8E6转换为VarChar,我可以使用há ðô§*à\Â'†øæ来代替68E109F0F40CA72A15E05CC22786F8E6

有没有任何基于SQL的解决scheme?

我find了解决scheme,其他地方:

 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_varbintohexsubstringfn_varbintohexsubstring的第一个参数告诉它添加0xF作为前缀或不。 fn_varbintohexstr调用fn_varbintohexsubstring作为第一个参数internaly。

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

与David Knight所说的相反,这两个select在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版开始是更好的select。

 convert(varchar(34), HASHBYTES('MD5','Hello World'),1) 

(1将hex转换为string)

将其转换为较低值,并通过子string从string的开始处移除0x:

 substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32) 

与将字节转换为string后在C#中获得的完全一样

在一个存储过程中使用下面的代码(这个过程包含了一个SPvariables)的个人经验,我可以证实,虽然没有文档,但是这个组合按照我的例子是100%

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

将数据types更改为varbinary似乎对我来说是最好的。