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?

Sim

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top