terça-feira, julho 26, 2011

Obter um Hash em SQL

Aparentemente obter um Hash em SQL é extremamente fácil...aparentemente...
Então em SQL temos a função HashBytes que recebe o tipo de codificação e a string a codificar.

Select HashBytes('SHA1', 'Test')

E o resultado disto é: 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA

Porreiro tem bom aspecto, então mas eu quero isto é numa string então vou afectar um nvarchar para colocar o resultado do HashBytes.

Declare @test as nvarchar(40)
set @test = HashBytes('SHA1', 'Test')
select @test

Resultado: ੤몲篠쓭揁秶䚧꯷땿𣏕

Ups...que é isto??? O problema está no retorno do HashBytes que é do tipo VarBinary e não do tipo VarChar. A solução é uma das duas opções seguintes, se uma é melhor que a outra não sei, mas se alguém souber agradecia que me informasse, o facto é que as duas funcionam.

SELECT master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', 'Test'), 1, 0)
ou
SELECT CONVERT(NVARCHAR(40),HashBytes('SHA1', 'Test'),2)

Resultado: 640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA

Sem comentários: