Generieren Sie eine MD5-Hash-Zeichenfolge mit T-SQL

Antworten:

66

Verwenden Sie HashBytes

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

Das gibt Ihnen 0xF53BD08920E5D25809DF2563EF9C52B6

- -

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

Das gibt Ihnen F53BD08920E5D25809DF2563EF9C52B6

SQLMenace
quelle
1
@Brendan, du hast das ", 2)" am Ende weggelassen.
Ryan Elkins
1
@ RyanElkins Ich bekomme das gleiche Ergebnis wie Brendan, und ich bin sicherlich die ", 2)" :(
Matthew
20

Lösung:

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

Keine der anderen Antworten hat bei mir funktioniert. Beachten Sie, dass SQL Server unterschiedliche Ergebnisse liefert, wenn Sie eine fest codierte Zeichenfolge übergeben oder aus einer Spalte in Ihrer Ergebnismenge eingeben. Im Folgenden finden Sie die Magie, die bei mir funktioniert hat, um eine perfekte Übereinstimmung zwischen SQL Server und MySql zu erzielen

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
jmacinnes
quelle
1
Die Verwendung LOWER()ist nur erforderlich, wenn zwischen Groß- und Kleinschreibung unterschieden wird.
T.Coutlakis
Die erste Konvertierung erweist sich als wichtig. Dies ergibt identischen MD5Hash im Vergleich zur MD5()Funktion von Postgresql. Ich habe mich gefragt, warum sich die MD5Hashs von Pythonund unterscheiden Postgresql. Vielen Dank für das Rezept ..
Ben
14

Für Daten mit bis zu 8000 Zeichen verwenden Sie:

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

Demo

Verwenden Sie für Binärdaten (ohne das Limit von 8000 Byte):

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

Demo

Slartidan
quelle
4

Versuche dies:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '[email protected]' )),3,32) 
Dellasavia
quelle
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
quelle
Lösung ... deklarieren Sie @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;

funktioniert bei mir.

Gita
quelle
0

Sie haben nicht ausdrücklich gesagt, dass die Zeichenfolge hexadezimal sein soll. Wenn Sie für die platzsparendere Basis-64-Zeichenfolgencodierung offen sind und SQL Server 2016 oder höher verwenden, finden Sie hier eine Alternative:

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

Dies erzeugt:

9TvQiSDl0lgJ3yVj75xStg==
N8allan
quelle