Gerar string hash MD5 com T-SQL

Respostas:

66

Use HashBytes

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

Isso lhe dará 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Isso lhe dará F53BD08920E5D25809DF2563EF9C52B6

SQLMenace
fonte
1
@Brendan, você deixou ", 2)" no final.
Ryan Elkins
1
@RyanElkins Eu obtenho o mesmo resultado que Brendan, e certamente estou incluído no ", 2)" :(
Mateus
20

Solução:

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

Nenhuma das outras respostas funcionou para mim. Observe que o SQL Server fornecerá resultados diferentes se você passar uma string codificada em vez de alimentá-la de uma coluna em seu conjunto de resultados. Abaixo está a mágica que funcionou para mim para fornecer uma combinação perfeita entre o SQL Server e o MySql

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
Jmacinnes
fonte
1
O uso LOWER()só é necessário se fizer distinção entre maiúsculas e minúsculas.
T.Coutlakis
A primeira conversão acaba sendo importante. Isso dá um MD5Hash idêntico em comparação com a MD5()função de Postgresql. Fiquei me perguntando por que os MD5hashs são diferentes de Pythone Postgresql. Obrigado pela receita ..
Ben
14

Para dados de até 8.000 caracteres, use:

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

Demo

Para dados binários (sem o limite de 8.000 bytes), use:

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

Demo

Slartidan
fonte
4

tente isto:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '[email protected]' )),3,32) 
dellasavia
fonte
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
fonte
Solução ... 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 mim.

Gita
fonte
0

Você não disse explicitamente que queria que a string fosse hexadecimal; se você estiver aberto para a codificação de string de base 64 com espaço mais eficiente e estiver usando o SQL Server 2016 ou posterior, aqui está uma alternativa:

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

Isso produz:

9TvQiSDl0lgJ3yVj75xStg==
N8allan
fonte