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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top