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

时间:2010-08-19 20:37:38

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

有没有办法在不使用fn_varbintohexstr的情况下生成类型为varchar(32)的MD5哈希字符串

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

因此可以在带有SCHEMABINDING的视图中使用

9 个答案:

答案 0 :(得分:173)

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

答案 1 :(得分:59)

使用HashBytes

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

那会给你0xF53BD08920E5D25809DF2563EF9C52B6

-

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

那会给你F53BD08920E5D25809DF2563EF9C52B6

答案 2 :(得分:20)

解决方案:

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

答案 3 :(得分:14)

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

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

答案 4 :(得分:13)

对于 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

答案 5 :(得分:4)

试试这个:

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

答案 6 :(得分:0)

声明@hash nvarchar(50) --declare @hash varchar(50)

set @hash ='1111111-2; 20190110143334; 001'-结果a5cd84bfc56e245bbf81210f05b7f65f 声明@value varbinary(max); 设置@value = convert(varbinary(max),@ hash);

选择
 SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5','1111111-2; 20190110143334; 001')),3,32)为'OK' ,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',@hash)),3,32)为'ERROR_01' ,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',convert(varbinary(max),@ hash))),3,32)为'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)

答案 7 :(得分:0)

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

为我工作。

答案 8 :(得分: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==