Sql server 使用T-SQL生成MD5哈希字符串

Sql server 使用T-SQL生成MD5哈希字符串,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,有没有一种方法可以在不使用fn_varbintohextr的情况下生成varchar(32)类型的MD5哈希字符串 SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32) 因此,它可以在具有SCHEMABINDING的视图中使用 CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2) 这将为您提供0xF53BD08920E5

有没有一种方法可以在不使用fn_varbintohextr的情况下生成varchar(32)类型的MD5哈希字符串

SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)
因此,它可以在具有SCHEMABINDING的视图中使用

CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)
这将为您提供0xF53BD08920E5D25809DF2563EF9C52B6

-

这将为您提供F53BD08920E5D25809DF2563EF9C52B6解决方案:

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

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

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

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

对于小于等于8000个字符的数据,请使用:

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

对于二进制数据(不限制8000字节),请使用:


对我有用

您没有明确表示希望字符串为十六进制;如果您对更节省空间的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==

在SQL2005中如何做到这一点?它没有返回正确编码的字符串…?@JoshuaRountree,在@Brendan上看到我的答案,你在最后去掉了“2”。@RyanElkins我得到了与Brendan相同的结果,我当然包括了“2”):(使用
LOWER()
仅在区分大小写时才有必要。第一次转换非常重要。与
MD5()相比,这会产生相同的
MD5
哈希值
Postgresql
的函数。我想知道为什么
MD5
hash与
Python
Postgresql
不同。谢谢你的配方。另请参阅解决方案…声明@hash varchar(50)
CONVERT(VARCHAR(32), master.sys.fn_repl_hash_binary(@binary_data), 2)
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)
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;
select SubString(h, 1, 32) from OpenJson(
    (select HashBytes('MD5', 'email@dot.com') h for json path)
) with (h nvarchar(max));
9TvQiSDl0lgJ3yVj75xStg==