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


Answers:



66

使用HashBytes

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

那会给你0xF53BD08920E5D25809DF2563EF9C52B6

--

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

那会给你F53BD08920E5D25809DF2563EF9C52B6


1
@Brendan,您最后省略了“,2)”。
瑞安·艾尔金斯

1
@RyanElkins我得到的结果与Brendan相同,而且我当然也包括“,2)” :(
Matthew

20

解:

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

16

没有其他答案对我有用。请注意,如果您传递一个硬编码的字符串而不是从结果集中的一列中输入,则SQL Server将给出不同的结果。下面是使我在SQL Server和MySql之间实现完美匹配的神奇方法

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

1
LOWER()仅在区分大小写时才需要使用。
T.Coutlakis 2014年

第一次转换很重要。MD5与的MD5()功能相比,这给出了相同的哈希值Postgresql。我不知道为什么MD5哈希与Python和不同Postgresql。谢谢你的食谱...

14

对于不超过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


4

试试这个:

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

0
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)


0
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

为我工作。


0

您没有明确表示要使字符串为十六进制。如果您愿意使用节省空间的基本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==
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.