Gerar string hash MD5 com T-SQL


Respostas:



66

Use HashBytes

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

Isso lhe dará 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Isso lhe dará F53BD08920E5D25809DF2563EF9C52B6


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)

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

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


4

tente isto:

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


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

Isso produz:

9TvQiSDl0lgJ3yVj75xStg==
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.