2008-08-05 10 views
96

Je veux obtenir le MD5 Hash d'une valeur de chaîne dans SQL Server 2005. Je le fais avec la commande suivante:convertir HashBytes VARCHAR

SELECT HashBytes('MD5', 'HelloWorld') 

Cependant, cela renvoie une VarBinary au lieu d'une valeur VarChar. Si je tente de convertir 0x68E109F0F40CA72A15E05CC22786F8E6 en VarChar, j'obtiens há ðô§*à\Â'†øæ au lieu de 68E109F0F40CA72A15E05CC22786F8E6.

Existe-t-il une solution SQL?

Yes

Répondre

130

J'ai trouvé la solution autre où:

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

Ne fonctionne pas en SQL Azure. – Raptor

+14

La fonction fn_varbintohexstr n'est pas documentée. Utilisez CONVERT (Char, @ value, 2) – Cheburek

+0

Je viens de recevoir bit par varbinary comme nécessitant un moyen de mise à jour dans l'entrepôt. Cela a fonctionné comme un charme! merci ... – nitefrog

-3

Modification du type de données à varbinary semble fonctionner le mieux pour moi.

53
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

+2

Pas besoin d'utiliser nvarchar inutilement. –

+3

La question indique SQL Server 2005 et si vous faites l'une des suggestions ci-dessus (et probablement toute autre version), ils ne font pas ce qui est demandé. Vous obtenez n'importe quel caractère équivalent aux octets, pas les octets comme une chaîne hexadécimale qui est ce qui est demandé. GateKiller et Xarqron donnent des réponses qui fonctionnent. –

27

Utilisation master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) au lieu de master.dbo.fn_varbintohexstr puis substringing le résultat. En fait, fn_varbintohexstr appelle fn_varbintohexsubstring en interne. Le premier argument de fn_varbintohexsubstring lui indique 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 directement fn_varbintohexsubstring.

+1

Merci, l'air beaucoup plus propre –

6
convert(varchar(34), HASHBYTES('MD5','Hello World'),1) 

(1 pour la conversion hexadécimal en chaîne)

convertir en abaisser et supprimer 0x dès le 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 des octets en chaîne

12

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 est un meilleur choix, à partir de la version 2008.

0

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

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)