Genere cadena hash MD5 con T-SQL

Respuestas:

66

Utilice HashBytes

SELECT HashBytes('MD5', '[email protected]')

Eso le dará 0xF53BD08920E5D25809DF2563EF9C52B6

-

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', '[email protected]'),2)

Eso le dará F53BD08920E5D25809DF2563EF9C52B6

SQLMenace
fuente
1
@Brendan, dejaste el ", 2)" al final.
Ryan Elkins
1
@RyanElkins Obtengo el mismo resultado que Brendan, y ciertamente estoy incluido en el ", 2)" :(
Mateo
20

Solución:

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

Ninguna de las otras respuestas funcionó para mí. Tenga en cuenta que SQL Server dará resultados diferentes si pasa una cadena codificada en lugar de alimentarla desde una columna en su conjunto de resultados. A continuación se muestra la magia que funcionó para mí para dar una combinación perfecta entre SQL Server y MySql

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
jmacinnes
fuente
1
El uso LOWER()solo es necesario si distingue entre mayúsculas y minúsculas.
T.Coutlakis
La primera conversión resulta importante. Esto da un MD5Hash idéntico en comparación con la MD5()función de Postgresql. Me preguntaba por MD5qué se diferencian los hashs de Pythony Postgresql. Gracias por la receta ..
Ben
14

Para datos de hasta 8000 caracteres, utilice:

CONVERT(VARCHAR(32), HashBytes('MD5', '[email protected]'), 2)

Demo

Para datos binarios (sin el límite de 8000 bytes) utilice:

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

Demo

Slartidan
fuente
4

prueba esto:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '[email protected]' )),3,32) 
Dellasavia
fuente
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)
fernando yevenes
fuente
Solución ... declare @hash varchar (50) md5.gromweb.com/?string=1111111-2%3B20190110143334%3B001
fernando yevenes
0
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

funciona para mi.

Gita
fuente
0

No dijiste explícitamente que querías que la cadena fuera hexadecimal; Si está abierto a la codificación de cadena base 64 más eficiente en cuanto al espacio, y está utilizando SQL Server 2016 o posterior, aquí hay una alternativa:

select SubString(h, 1, 32) from OpenJson(
    (select HashBytes('MD5', '[email protected]') h for json path)
) with (h nvarchar(max));

Esto produce:

9TvQiSDl0lgJ3yVj75xStg==
N8allan
fuente