Generate MD5 hash string with T-SQL

Is there a way to generate MD5 Hash string of type varchar(32) without using fn_varbintohexstr

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

So it could be used inside a view with SCHEMABINDING

297647 次浏览
CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)

使用 HashBytes

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

That will give you 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

这将得到 F53BD08920E5D25809DF2563EF9C52B6

解决方案:

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

其他的答案对我都不管用。注意,如果传入硬编码的字符串,与从结果集中的列提供字符串相比,SQLServer 将提供不同的结果。下面是让我在 SQLServer 和 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)

Demo

For binary data (without the limit of 8000 bytes) use:

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

Demo

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;

我没问题。

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

同样,大多数解决方案不能正常工作,这是仔细测试,以返回10个不同文本列组合的唯一结果(KEY CHOGE: 转换为 varchar (X) ,其中 x 是字符串的最大长度 < 4000,对于较长的字符串,使用其他方法) :

LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar(4000), EmailAddress)), 2))