Générer une chaîne de hachage MD5 avec T-SQL


Réponses:



66

Utiliser HashBytes

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

Cela vous donnera 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Cela vous donnera F53BD08920E5D25809DF2563EF9C52B6


1
@Brendan, vous avez laissé le ", 2)" à la fin.
Ryan Elkins

1
@RyanElkins J'obtiens le même résultat que Brendan, et je suis certainement inclus dans le ", 2)" :(
Matthew

20

Solution:

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

16

Aucune des autres réponses n'a fonctionné pour moi. Notez que SQL Server donnera des résultats différents si vous transmettez une chaîne codée en dur au lieu de l'alimenter à partir d'une colonne de votre jeu de résultats. Voici la magie qui a fonctionné pour moi pour donner une correspondance parfaite entre SQL Server et MySql

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

1
L'utilisation LOWER()n'est nécessaire que si elle est sensible à la casse.
T.Coutlakis

La première conversion s'avère importante. Cela donne un MD5Hash identique à la MD5()fonction de Postgresql. Je me demandais pourquoi les MD5hashs diffèrent de Pythonet Postgresql. Merci pour la recette ..
Ben

14

Pour les données jusqu'à 8000 caractères, utilisez:

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

Demo

Pour les données binaires (sans la limite de 8000 octets), utilisez:

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

Demo


4

essaye ça:

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;

travaille pour moi.


0

Vous n'avez pas dit explicitement que vous vouliez que la chaîne soit hexadécimale; si vous êtes ouvert au codage de chaîne de base 64 plus efficace en termes d'espace et que vous utilisez SQL Server 2016 ou version ultérieure, voici une alternative:

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

Cela produit:

9TvQiSDl0lgJ3yVj75xStg==
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.