La conversione HashBytes VarChar
-
08-06-2019 - |
Domanda
Voglio ottenere l'Hash MD5 di un valore di stringa in SQL Server 2005.Lo faccio con il seguente comando:
SELECT HashBytes('MD5', 'HelloWorld')
Tuttavia, questo restituisce un VarBinary invece di un valore di VarChar.Se si tenta di convertire 0x68E109F0F40CA72A15E05CC22786F8E6
in un VarChar ho há ðô§*à\Â'†øæ
invece di 68E109F0F40CA72A15E05CC22786F8E6
.
C'è basata su SQL soluzione?
Soluzione
Ho trovato la soluzione, altro, dove:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Altri suggerimenti
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Utilizzare master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
invece di master.dbo.fn_varbintohexstr
e poi substringing
il risultato.
Infatti fn_varbintohexstr
chiamate fn_varbintohexsubstring
internamente.Il primo argomento di fn_varbintohexsubstring
dice di aggiungere 0xF
come prefisso o non. fn_varbintohexstr
chiamate fn_varbintohexsubstring
con 1
come primo argomento internaly.
Perché non c'è bisogno 0xF
, chiamare fn_varbintohexsubstring
direttamente.
Contrariamente a quanto David Knight dice, queste due alternative restituire la stessa risposta 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))
Così sembra che la prima è una scelta migliore, a partire dalla versione 2008.
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 per la conversione da esadecimale a stringa)
convertire questo per abbassare e rimuovere 0x dall'inizio della stringa sottostringa:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
esattamente come quello che si ottiene in C# dopo la conversione da byte a stringa
Con l'esperienza personale utilizzando il seguente codice all'interno di una Stored Procedure che Hash di un SP Variabile posso confermare, anche se privi di documenti, questa combinazione funziona al 100% come per il mio esempio:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Modifica del tipo di dati varbinary sembra che funziona meglio per me.