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
7 réponses
j'ai trouvé la solution ailleurs où:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
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.
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.
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
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)
changer le type de données en varbinary semble être le meilleur pour moi.