Converter HashBytes para VarChar
-
08-06-2019 - |
Pergunta
Eu quero obter o Hash MD5 de um valor de seqüência de caracteres no SQL Server 2005.Eu faço isso com o seguinte comando:
SELECT HashBytes('MD5', 'HelloWorld')
No entanto, este retorna uma variável binária em vez de um valor VarChar.Se eu tentar converter 0x68E109F0F40CA72A15E05CC22786F8E6
em um VarChar eu chegar há ðô§*à\Â'†øæ
em vez de 68E109F0F40CA72A15E05CC22786F8E6
.
Existe alguma baseado em SQL solução?
Solução
Eu encontrei a solução mais:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Outras dicas
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Utilização master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
em vez de master.dbo.fn_varbintohexstr
e, em seguida, substringing
o resultado.
Na verdade fn_varbintohexstr
chamadas fn_varbintohexsubstring
internamente.O primeiro argumento de fn_varbintohexsubstring
diz-lhe para adicionar 0xF
como o prefixo ou não. fn_varbintohexstr
chamadas fn_varbintohexsubstring
com 1
como o primeiro argumento internaly.
Porque você não precisa 0xF
, chamada de fn_varbintohexsubstring
diretamente.
Ao contrário do que David Knight diz, essas duas alternativas retornar a mesma resposta em 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))
Portanto, parece que a primeira é a melhor escolha, a partir da versão 2008.
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 para a conversão de hexadecimal para string)
converter este para baixo e remova 0x desde o início da seqüência de caracteres de texto:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
exatamente o mesmo como o que temos em C# após a conversão de bytes para cadeia
Com a experiência pessoal de utilizar o seguinte código dentro de um Procedimento Armazenado que um Hash SP Variável posso confirmar que, embora não documentado, esta combinação funciona 100%, como por exemplo:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Alterar o tipo de dados varbinary parece funcionar melhor para mim.