将HashBytes转换为VarChar


127

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

SELECT HashBytes('MD5', 'HelloWorld')

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

是否有任何基于SQL的解决方案?

Answers:


147

我在其他地方找到了解决方案:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

19
fn_varbintohexstr没有文档记录的功能。使用CONVERT(Char,@ value,2)
Cheburek

我只是被varbinary所困扰,因为他需要一种更新仓库的方法。这就像一个魅力!谢谢...
nitefrog

此方法非常慢,使用了未记录的功能,并且在Azure中不起作用。不酷 请改用转换!
罗克兰

4
CONVERT()在SQL 2005中不起作用。如果您使用的是SQL 2008或更高版本,请全部使用CONVERT()。遗憾的是,我不知道有一个命令可用于所有SQL版本,因此要么在脚本中进行一些疯狂的版本检查,要么就在升级SQL版本时需要修复该功能的地方做个注释。
卡尔·布塞玛

5
CONVERT(Char,@ value,2)仅输出32个字节-如果对sha1哈希进行此操作,则将其截断,您需要convert(char(48),@ value,2)来保持适当的输出。
安德鲁·希尔

82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

4
这适用于SQL Azure。对于SHA1:SELECT CONVERT(VARCHAR(40),HashBytes('SHA1','Hello World'),2)
Raptor

4
无需不必要地使用nvarchar。
伊恩·坎普

3
问题是SQL Server 2005,如果您在其中提出了上述建议中的任何一个(可能还建议您使用其他版本),它们将不会执行所要求的操作。您得到的字节等于任何字符,而不是要求的字节作为十六进制字符串。GateKiller和Xarqron给出了可行的答案。
大卫·奈特

我在哪里可以了解这些转换样式?2在这种情况下其被作为参数传递。以及如何使它等效于C#代码?我应该选择哪种编码?
Dmytro Zhluktenko

31

使用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

因为不需要0xF,请fn_varbintohexsubstring直接致电。


27

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版开始,第一个似乎是一个更好的选择。


请勿错误输入,以得到完全不同的答案!... convert(varchar,HashBytes('MD5','Hello World')),2)
andate pate

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

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

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

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

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


2

根据在存储过程中使用以下代码的个人经验,该代码对SP变量进行了哈希处理,我可以确认(虽然没有记录),但根据我的示例,此组合的工作效果为100%:

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

-3

将数据类型更改为varbinary似乎最适合我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.