Convertir HashBytes en VarChar

127

Je veux obtenir le hachage MD5 d'une valeur de chaîne 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 j'essaye de convertir 0x68E109F0F40CA72A15E05CC22786F8E6en un VarChar j'obtiens à la há ðô§*à\Â'†øæplace de 68E109F0F40CA72A15E05CC22786F8E6.

Existe-t-il une solution basée sur SQL?

Oui

GateKiller
la source

Réponses:

147

J'ai trouvé la solution ailleurs où:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
GateKiller
la source
19
fn_varbintohexstr n'est pas une fonction documentée. Utilisez CONVERT (Char, @ value, 2)
Cheburek
Je viens de recevoir un peu de varbinary comme ayant besoin d'un moyen de mise à jour dans l'entrepôt. Cela a fonctionné comme un charme! merci ...
nitefrog
Cette méthode est très lente, utilise une fonction non documentée et ne fonctionne pas dans Azure. Pas cool. Utilisez plutôt Convertir!
Rocklan
4
CONVERT () ne fonctionne pas dans SQL 2005. Si vous utilisez SQL 2008 ou supérieur, utilisez CONVERT () autant que vous le souhaitez. Malheureusement, je ne suis pas au courant d'une seule commande qui fonctionnera pour toutes les versions de SQL, alors faites une vérification de version folle dans votre script, ou notez simplement quelque part que vous devez corriger la fonction si vous mettez à niveau les versions de SQL.
Carl Bussema
5
CONVERT (Char, @ value, 2) ne produit que 32 octets - si vous faites cela en un hachage sha1, vous le tronquerez, vous devez convertir (char (48), @ value, 2) pour conserver la sortie appropriée.
Andrew Hill
82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Vaurien
la source
4
cela fonctionne dans SQL Azure. pour SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor
4
Pas besoin d'utiliser nvarchar inutilement.
Ian Kemp
3
La question indique SQL Server 2005 et si vous faites l'une des suggestions ci-dessus (et probablement toute autre version également), ils ne font pas ce qui est demandé. Vous obtenez le caractère auquel les octets sont équivalents, et non les octets sous forme de chaîne hexadécimale, ce qui est demandé. GateKiller et Xarqron donnent des réponses qui fonctionnent.
David Knight
Où puis-je lire ces styles de conversion? 2 dans ce cas qui est passé en paramètre. Et comment en faire un équivalent en code C #? Quel encodage dois-je choisir?
Dmytro Zhluktenko
31

Utilisez à la master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)place de master.dbo.fn_varbintohexstrpuis substringingle résultat.

En fait fn_varbintohexstrappelle en fn_varbintohexsubstringinterne. Le premier argument de lui fn_varbintohexsubstringdit d'ajouter 0xFcomme préfixe ou non. fn_varbintohexstrappels fn_varbintohexsubstringavec1 comme premier argument en interne.

Parce que vous n'en avez pas besoin 0xF, appelez fn_varbintohexsubstringdirectement.

Xaqron
la source
27

Contrairement à ce que dit David Knight , 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.

Timo Riikonen
la source
Ne tapez pas ceci par erreur qui donne une réponse subtilement différente! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate
13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

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

convertissez-le en inférieur et supprimez 0x du début de la chaîne par sous-chaîne:

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

exactement la même chose que ce que nous obtenons en C # après la conversion d'octets en chaîne

Ramans
la source
2

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

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Simon Jones
la source
-3

Changer le type de données en varbinary semble fonctionner le mieux pour moi.

anopres
la source