Konvertieren Sie HashBytes in VarChar


127

Ich möchte den MD5-Hash eines Zeichenfolgenwerts in SQL Server 2005 abrufen. Ich mache dies mit dem folgenden Befehl:

SELECT HashBytes('MD5', 'HelloWorld')

Dies gibt jedoch eine VarBinary anstelle eines VarChar-Werts zurück. Wenn ich versuche, 0x68E109F0F40CA72A15E05CC22786F8E6in ein VarChar zu konvertieren, bekomme ich há ðô§*à\Â'†øæstattdessen 68E109F0F40CA72A15E05CC22786F8E6.

Gibt es eine SQL-basierte Lösung?

Ja

Antworten:


147

Ich habe die Lösung woanders gefunden:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

19
fn_varbintohexstr ist keine dokumentierte Funktion. Verwenden Sie CONVERT (Char, @ value, 2)
Cheburek

Ich habe mich gerade mit Varbinary beschäftigt, weil ich einen Weg für ein Update in das Lager brauchte. Das hat wie ein Zauber gewirkt! danke ...
Nitefrog

Diese Methode ist sehr langsam, verwendet eine undokumentierte Funktion und funktioniert in Azure nicht. Nicht cool. Verwenden Sie stattdessen Konvertieren!
Rocklan

4
CONVERT () funktioniert in SQL 2005 nicht. Wenn Sie SQL 2008 oder höher verwenden, verwenden Sie CONVERT () nach Belieben. Leider ist mir kein einziger Befehl bekannt, der für alle SQL-Versionen funktioniert. Führen Sie daher entweder eine verrückte Versionsprüfung in Ihrem Skript durch oder notieren Sie sich irgendwo, dass Sie die Funktion reparieren müssen, wenn Sie SQL-Versionen aktualisieren.
Carl Bussema

5
CONVERT (Char, @ value, 2) gibt nur 32 Bytes aus. Wenn Sie dies mit einem sha1-Hash tun, werden Sie ihn abschneiden. Sie müssen convert (char (48), @ value, 2), um die entsprechende Ausgabe beizubehalten.
Andrew Hill

82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

4
Dies funktioniert in SQL Azure. für SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor

4
Sie müssen nvarchar nicht unnötig verwenden.
Ian Kemp

3
Die Frage lautet SQL Server 2005, und wenn Sie einen der oben genannten Vorschläge (und wahrscheinlich auch eine andere Version) ausführen, tun sie nicht das, wonach sie gefragt werden. Sie erhalten das Zeichen, dem die Bytes entsprechen, nicht die Bytes als Hex-Zeichenfolge, nach der gefragt wird. GateKiller und Xarqron geben Antworten, die funktionieren.
David Knight

Wo kann ich über diese Konvertierungsstile lesen? 2 in diesem Fall, der als Parameter übergeben wird. Und wie kann man ein Äquivalent dazu in C # -Code erstellen? Welche Kodierung soll ich wählen?
Dmytro Zhluktenko

31

Verwenden Sie master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)anstelle von master.dbo.fn_varbintohexstrund dann substringingdas Ergebnis.

In der Tat fn_varbintohexstrAnrufe fn_varbintohexsubstringintern. Das erste Argument von fn_varbintohexsubstringsagt, dass es 0xFals Präfix hinzugefügt werden soll oder nicht. fn_varbintohexstrruft fn_varbintohexsubstringmit 1als erstes internes Argument auf.

Weil Sie nicht brauchen 0xF, rufen Sie fn_varbintohexsubstringdirekt an.


27

Im Gegensatz zu David Knight geben diese beiden Alternativen in MS SQL 2008 dieselbe Antwort zurück:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

Es sieht also so aus, als wäre der erste ab Version 2008 die bessere Wahl.


Geben Sie dies nicht versehentlich ein, was eine subtil andere Antwort ergibt! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate

13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 zum Konvertieren von Hexadezimal in Zeichenfolge)

konvertiere dies in niedriger und entferne 0x vom Anfang des Strings durch Teilzeichenfolge:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

genau das gleiche wie in C #, nachdem wir Bytes in einen String konvertiert haben


2

Aufgrund meiner persönlichen Erfahrung mit der Verwendung des folgenden Codes in einer gespeicherten Prozedur, in der eine SP-Variable gehasht wurde, kann ich bestätigen, dass diese Kombination, obwohl nicht dokumentiert, gemäß meinem Beispiel zu 100% funktioniert:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)

-3

Das Ändern des Datentyps in varbinary scheint für mich am besten zu funktionieren.

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.