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

Réponses:


147

J'ai trouvé la solution ailleurs où:

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

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)

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.


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.


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


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)

-3

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.