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


Antworten:



66

Verwenden Sie HashBytes

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

Das gibt Ihnen 0xF53BD08920E5D25809DF2563EF9C52B6

- -

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

Das gibt Ihnen F53BD08920E5D25809DF2563EF9C52B6


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)

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

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


4

Versuche dies:

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)

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.


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

Dies erzeugt:

9TvQiSDl0lgJ3yVj75xStg==
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.