Konvertieren HashBytes zu VarChar
-
08-06-2019 - |
Frage
Ich möchte den MD5-Hash einer Zeichenfolge in SQL Server 2005.Ich mache das mit dem folgenden Befehl:
SELECT HashBytes('MD5', 'HelloWorld')
Allerdings, dies gibt einen VarBinary anstelle von VarChar-Wert.Wenn ich versuche zu konvertieren 0x68E109F0F40CA72A15E05CC22786F8E6
in einer VarChar-ich bekommen há ðô§*à\Â'†øæ
statt 68E109F0F40CA72A15E05CC22786F8E6
.
Gibt es eine SQL-basierte Lösung?
Lösung
Ich habe die Lösung gefunden, wo sonst:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Andere Tipps
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Verwenden master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
statt master.dbo.fn_varbintohexstr
und dann substringing
das Ergebnis.
In der Tat fn_varbintohexstr
Aufrufe fn_varbintohexsubstring
intern.Das erste argument von fn_varbintohexsubstring
es erzählt hinzufügen 0xF
als Präfix oder nicht. fn_varbintohexstr
Aufrufe fn_varbintohexsubstring
mit 1
als erstes argument intern.
Da brauchen Sie nicht 0xF
, rufen Sie fn_varbintohexsubstring
direkt.
Im Gegensatz zu dem, was David Knight sagt, diese beiden alternativen Rückkehr die gleiche Antwort in MS SQL 2008:
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
So wie es aussieht die erste ist eine bessere Wahl, ab der version 2008.
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 für die Umwandlung von hexadezimal-string)
konvertieren diesen zu senken und entfernen 0x vom Anfang der Zeichenfolge Teilzeichenfolge:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
genau das gleiche wie das, was wir erhalten, in C# nach der Konvertierung von Byte zu string
Mit persönlichen Erfahrungen von den folgenden code in einer Gespeicherten Prozedur, die eine Hash-SP-Variable, die ich bestätigen kann, obwohl nicht dokumentiert, diese Kombination funktioniert zu 100% wie pro mein Beispiel:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Ändern Sie den Datentyp varbinary scheint zu funktionieren am besten für mich.