Converti HashBytes in VarChar


127

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 valore VarBinary anziché un valore VarChar. Se provo a convertire 0x68E109F0F40CA72A15E05CC22786F8E6in VarChar ottengo há ðô§*à\Â'†øæinvece di 68E109F0F40CA72A15E05CC22786F8E6.

Esiste una soluzione basata su SQL?

Risposte:


147

Ho trovato la soluzione altro dove:

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

19
fn_varbintohexstr non è una funzione documentata. Usa CONVERT (Char, @ value, 2)
Cheburek,

Ho appena ricevuto bit da varbinary perché ho bisogno di un aggiornamento per il magazzino. Questo ha funzionato come un fascino! grazie ...
nitefrog,

Questo metodo è molto lento, usa una funzione non documentata e non funziona in Azure. Non fico. Usa invece Converti!
Rocklan,

4
CONVERT () non funziona in SQL 2005. Se si utilizza SQL 2008 o versioni successive, utilizzare CONVERT () tutto ciò che si desidera. Purtroppo non sono a conoscenza di un singolo comando che funzionerà per tutte le versioni di SQL, quindi esegui un controllo pazzo della versione nel tuo script o prendi nota da qualche parte che devi correggere la funzione se aggiorni le versioni di SQL.
Carl Bussema,

5
CONVERT (Char, @ value, 2) genera solo 32 byte - se lo fai in un hash sha1 lo troncherai, devi convertire (char (48), @ value, 2) per mantenere l'output appropriato.
Andrew Hill,

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

4
funziona in SQL Azure. per SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor

4
Non è necessario utilizzare nvarchar inutilmente.
Ian Kemp

3
La domanda indica SQL Server 2005 e se si esegue uno dei suggerimenti di cui sopra (e probabilmente anche qualsiasi altra versione) non fanno ciò che viene richiesto. Ottieni qualsiasi carattere a cui equivalgono i byte, non i byte come una stringa esadecimale che è ciò che viene richiesto. GateKiller e Xarqron danno risposte che funzionano.
David Knight,

Dove posso leggere questi stili di conversione? 2 in questo caso che viene passato come parametro. E come fare un equivalente di quello nel codice C #? Quale codifica dovrei scegliere?
Dmytro Zhluktenko,

31

Utilizzare master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)invece di master.dbo.fn_varbintohexstre quindi substringingil risultato.

In effetti fn_varbintohexstrchiama fn_varbintohexsubstringinternamente. Il primo argomento di fn_varbintohexsubstringdice che deve essere aggiunto 0xFo meno come prefisso. fn_varbintohexstrchiamate fn_varbintohexsubstringcon 1il primo argomento internaly.

Perché non è necessario 0xF, chiamare fn_varbintohexsubstringdirettamente.


27

Contrariamente a quanto afferma David Knight , queste due alternative restituiscono 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))

Quindi sembra che la prima sia una scelta migliore, a partire dalla versione 2008.


Non digitare questo per errore che dà una risposta leggermente diversa! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andate pate

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

(1 per convertire esadecimali in stringa)

converti questo in basso e rimuovi 0x dall'inizio della stringa per sottostringa:

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

esattamente lo stesso di quello che otteniamo in C # dopo aver convertito i byte in stringa


2

Con l'esperienza personale di usare il seguente codice all'interno di una Stored Procedure che ha tratteggiato una variabile SP, posso confermare, anche se non documentata, questa combinazione funziona al 100% come nel mio esempio:

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

-3

Cambiare il tipo di dati in varbinary sembra funzionare meglio per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.