Genera una stringa hash MD5 con T-SQL


Risposte:



66

Usa HashBytes

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

Questo ti darà 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Questo ti darà F53BD08920E5D25809DF2563EF9C52B6


1
@Brendan, hai lasciato ", 2)" alla fine.
Ryan Elkins

1
@ RyanElkins ottengo lo stesso risultato di Brendan, e sono certamente incluso nel ", 2)" :(
Matthew

20

Soluzione:

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

16

Nessuna delle altre risposte ha funzionato per me. Si noti che SQL Server darà risultati diversi se si passa una stringa hardcoded invece di inserirla da una colonna nel set di risultati. Di seguito è riportata la magia che ha funzionato per me per fornire una corrispondenza perfetta tra SQL Server e MySql

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

1
L'utilizzo LOWER()è necessario solo se fa distinzione tra maiuscole e minuscole.
T.Coutlakis

La prima conversione si rivela importante. Ciò fornisce un MD5hash identico rispetto alla MD5()funzione di Postgresql. Mi chiedevo perché gli MD5hash differissero da Pythone Postgresql. Grazie per la ricetta ..
Ben

14

Per dati fino a 8000 caratteri utilizzare:

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

Demo

Per i dati binari (senza il limite di 8000 byte) utilizzare:

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

Demo


4

prova questo:

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;

per me va bene.


0

Non hai detto esplicitamente che volevi che la stringa fosse esadecimale; se sei aperto alla codifica di stringhe base 64 più efficiente in termini di spazio e utilizzi SQL Server 2016 o versioni successive, ecco un'alternativa:

select SubString(h, 1, 32) from OpenJson(
    (select HashBytes('MD5', 'email@dot.com') h for json path)
) with (h nvarchar(max));

Questo produce:

9TvQiSDl0lgJ3yVj75xStg==
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.