Conversion HashBytes en VarChar

je veux obtenir le hachage MD5 d'une valeur de chaîne de caractères dans SQL Server 2005. Je le fais avec la commande suivante:

SELECT HashBytes('MD5', 'HelloWorld')

cependant, cela renvoie un VarBinary au lieu d'une valeur VarChar. Si je tente de convertir 0x68E109F0F40CA72A15E05CC22786F8E6 en un VarChar je reçois há ðô§*àÂ'†øæ au lieu de 68E109F0F40CA72A15E05CC22786F8E6 .

y a-t-il une solution basée sur SQL?

Oui

105
demandé sur Community 2008-08-05 15:49:11

7 réponses

j'ai trouvé la solution ailleurs où:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
135
répondu GateKiller 2008-08-05 14:26:41
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
63
répondu Rapscallion 2011-09-07 16:01:17

utilisez master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) au lieu de master.dbo.fn_varbintohexstr et ensuite substringing le résultat.

en fait fn_varbintohexstr appelle fn_varbintohexsubstring en interne. Le premier argument de fn_varbintohexsubstring lui dit d'ajouter 0xF comme préfixe ou non. fn_varbintohexstr appelle fn_varbintohexsubstring avec 1 comme premier argument interne.

parce que vous n'avez pas besoin de 0xF , appelez fn_varbintohexsubstring directement.

29
répondu Xaqron 2011-03-17 16:00:17

contrairement à ce que David Knight dit, ces deux alternatives renvoient la même réponse dans 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))

il semble donc que le premier soit un meilleur choix, à partir de la version 2008.

18
répondu Timo Riikonen 2017-05-23 11:55:03
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 pour convertir hexadécimal en chaîne)

convertissez ceci en lower et supprimez 0x du début de la chaîne en soustrayant:

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

exactement le même que ce que nous obtenons en C# Après avoir converti des octets en chaîne de caractères

10
répondu Ramans 2011-09-07 16:00:51

avec une expérience personnelle de l'utilisation du code suivant dans une procédure stockée qui a Hashé une Variable SP je peux confirmer, bien que non documentée, cette combinaison fonctionne à 100% comme selon mon exemple:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
1
répondu Simon Jones 2015-02-24 22:54:19

changer le type de données en varbinary semble être le meilleur pour moi.

-3
répondu anopres 2010-02-17 21:31:15