【问题标题】:Generate MD5 hash string with T-SQL使用 T-SQL 生成 MD5 哈希字符串
【发布时间】:2011-04-01 08:36:33
【问题描述】:

有没有办法不使用 fn_varbintohexstr 来生成 varchar(32) 类型的 MD5 哈希字符串

SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)

所以它可以在带有 SCHEMABINDING 的视图中使用

【问题讨论】:

标签: sql-server tsql sql-server-2008


【解决方案1】:
CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)

【讨论】:

【解决方案2】:

使用HashBytes

SELECT HashBytes('MD5', 'email@dot.com')

这会给你 0xF53BD08920E5D25809DF2563EF9C52B6

-

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'email@dot.com'),2)

这会给你 F53BD08920E5D25809DF2563EF9C52B6

【讨论】:

  • @Brendan,你在最后省略了“,2)”。
  • @RyanElkins 我得到了与 Brendan 相同的结果,当然我也包括在 ",2)" 中:(
【解决方案3】:

解决方案:

SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5','your text')),3,32)

【讨论】:

    【解决方案4】:

    其他答案都不适合我。请注意,如果您传入硬编码字符串而不是从结果集中的列中提供它,SQL Server 将给出不同的结果。下面是让我在 SQL Server 和 MySql 之间完美匹配的魔法

    select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
    

    【讨论】:

    • 只有在区分大小写时才需要使用LOWER()
    • 第一次转换很重要。与PostgresqlMD5() 函数相比,这给出了相同的MD5 Hash。我想知道为什么MD5 散列不同于PythonPostgresql。谢谢你的食谱..
    【解决方案5】:

    试试这个:

    select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  'email@dot.com' )),3,32) 
    

    【讨论】:

      【解决方案6】:

      对于最多 8000 个字符的数据,请使用:

      CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)
      

      Demo

      对于二进制数据(没有 8000 字节的限制)使用:

      CONVERT(VARCHAR(32), master.sys.fn_repl_hash_binary(@binary_data), 2)
      

      Demo

      【讨论】:

        【解决方案7】:
        declare @hash nvarchar(50)
        --declare @hash varchar(50)
        
        set @hash = '1111111-2;20190110143334;001'  -- result a5cd84bfc56e245bbf81210f05b7f65f
        declare @value varbinary(max);
        set @value = convert(varbinary(max),@hash);
        
        
        select  
         SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', '1111111-2;20190110143334;001')),3,32) as 'OK'
        ,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', @hash)),3,32) as 'ERROR_01'
        ,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',convert(varbinary(max),@hash))),3,32) as 'ERROR_02'
        ,SUBSTRING(sys.fn_sqlvarbasetostr(sys.fn_repl_hash_binary(convert(varbinary(max),@hash))),3,32)
        ,SUBSTRING(sys.fn_sqlvarbasetostr(master.sys.fn_repl_hash_binary(@value)),3,32)
        

        【讨论】:

        【解决方案8】:
        SELECT CONVERT(
              VARCHAR(32),
              HASHBYTES(
                           'MD5',
                           CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                           + CAST(prescrip.[Description] AS VARCHAR(250))
                       ),
              2
          ) MD5_Value;
        

        为我工作。

        【讨论】:

          【解决方案9】:

          您没有明确表示您希望字符串为十六进制;如果您对更节省空间的 base 64 字符串编码持开放态度,并且您使用的是 SQL Server 2016 或更高版本,则可以使用以下替代方法:

          select SubString(h, 1, 32) from OpenJson(
              (select HashBytes('MD5', 'email@dot.com') h for json path)
          ) with (h nvarchar(max));
          

          这会产生:

          9TvQiSDl0lgJ3yVj75xStg==
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-26
            • 2015-08-14
            • 1970-01-01
            • 2017-05-24
            相关资源
            最近更新 更多