【问题标题】:Convert HashBytes to VarChar将 HashBytes 转换为 VarChar
【发布时间】:2010-09-05 08:27:00
【问题描述】:

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

SELECT HashBytes('MD5', 'HelloWorld')

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

有没有基于 SQL 的解决方案?

Yes

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

    【讨论】:

    • fn_varbintohexstr 未记录功能。使用 CONVERT(Char,@value,2)
    • 我刚刚被 varbinary 所了解,因为需要一种更新到仓库的方法。这就像一个魅力!谢谢...
    • 这种方法很慢,使用了一个未记录的函数,在 Azure 中不起作用。不酷。请改用转换!
    • CONVERT() 在 SQL 2005 中不起作用。如果您使用的是 SQL 2008 或更高版本,请随意使用 CONVERT()。遗憾的是,我不知道有一个命令适用于所有 SQL 版本,所以要么在你的脚本中做一些疯狂的版本检查,要么在升级 SQL 版本时在需要修复该功能的地方做一个注释。跨度>
    • CONVERT(Char,@value,2) 仅输出 32 个字节 - 如果您对 sha1 哈希执行此操作,您将截断它,您需要 convert(char(48),@value,2) 到保持适当的输出。
    【解决方案2】:
    SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
    

    【讨论】:

    • 这适用于 SQL Azure。对于 SHA1:SELECT CONVERT(VARCHAR(40), HashBytes('SHA1', 'Hello World'), 2)
    • 不需要不必要地使用nvarchar。
    • 问题说明 SQL Server 2005,如果您在其中执行上述任何建议(可能还有任何其他版本),他们不会执行要求的操作。您会得到字节等效的任何字符,而不是字节作为所要求的十六进制字符串。 GateKiller 和 Xarqron 给出了有效的答案。
    • 在哪里可以了解这些转换样式? 2 在这种情况下作为参数传递。以及如何在 C# 代码中进行等效处理?我应该选择什么编码?
    【解决方案3】:

    使用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 并使用 1 作为内部的第一个参数。

    因为不需要0xF,所以直接拨打fn_varbintohexsubstring

    【讨论】:

      【解决方案4】:

      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)
      • 正确,我错过了转换中的“,2”,这是重要的部分
      【解决方案5】:
      convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
      

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

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

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

      与我们在 C# 中将字节转换为字符串后得到的完全一样

      【讨论】:

        【解决方案6】:

        根据在散列 SP 变量的存储过程中使用以下代码的个人经验,我可以确认,虽然没有记录,但根据我的示例,这种组合 100% 有效:

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

        【讨论】:

        • 已接受答案的副本 + SHA2_512 散列算法产生 256 个字符,因此您使用 SUBSTRING 散列散列的第二部分
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-07
          • 2011-12-11
          • 2021-05-22
          • 2013-02-28
          • 2021-04-25
          • 1970-01-01
          相关资源
          最近更新 更多