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
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