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?

sì

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.