Genere cadena hash MD5 con T-SQL


Respuestas:



66

Utilice HashBytes

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

Eso le dará 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Eso le dará F53BD08920E5D25809DF2563EF9C52B6


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)

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 ...

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@dot.com'), 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


4

prueba esto:

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;

funciona para mi.


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@dot.com') h for json path)
) with (h nvarchar(max));

Esto produce:

9TvQiSDl0lgJ3yVj75xStg==
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.