Question

Je souhaite obtenir le hachage MD5 d'une valeur de chaîne dans SQL Server 2005.Je fais cela avec la commande suivante :

SELECT HashBytes('MD5', 'HelloWorld')

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

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

Oui

Était-ce utile?

La solution

J'ai trouvé la solution ailleurs où :

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

Autres conseils

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

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

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

Parce que tu n'as pas besoin 0xF, appel fn_varbintohexsubstring directement.

Contrairement à ce que David Chevalier 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.

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

(1 pour convertir l'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 avoir converti les octets en chaîne

Avec une 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, que cette combinaison fonctionne à 100 % selon mon exemple :

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top