2008-08-05 29 views
96

Quiero obtener el hash MD5 de un valor de cadena en SQL Server 2005. Lo hago con el siguiente comando:convierto HashBytes a VARCHAR

SELECT HashBytes('MD5', 'HelloWorld') 

Sin embargo, este devuelve un VarBinary en lugar de un valor VARCHAR. Si intento convertir 0x68E109F0F40CA72A15E05CC22786F8E6 en VarChar obtengo há ðô§*à\Â'†øæ en lugar de 68E109F0F40CA72A15E05CC22786F8E6.

¿Hay alguna solución basada en SQL?

Yes

Respuesta

130

he encontrado la solución en otro lugar:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32) 
+0

No funciona en SQL Azure. – Raptor

+14

fn_varbintohexstr no es una función documentada. Use CONVERT (Char, @ value, 2) – Cheburek

+0

Acabo de recibir un bit por varbinary que necesita una forma de actualizar el almacén. ¡Funcionó como por arte de magia! gracias ... – nitefrog

-3

Cambiar el tipo de datos a varbinary parece que funciona mejor para mí.

53
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2) 
+4

esto funciona en SQL Azure. para SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2) – Raptor

+2

No es necesario utilizar nvarchar innecesariamente. –

+3

La pregunta dice SQL Server 2005 y si hace alguna de las sugerencias anteriores (y probablemente alguna otra versión también), no hacen lo que se solicita. Obtienes el carácter que los bytes son equivalentes, no los bytes como una cadena hexadecimal, que es lo que se solicita. GateKiller y Xarqron dan respuestas que funcionan. –

27

Uso master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0) en lugar de master.dbo.fn_varbintohexstr y luego substringing el resultado.

De hecho, fn_varbintohexstr llama a fn_varbintohexsubstring internamente. El primer argumento de fn_varbintohexsubstring le dice que agregue 0xF como prefijo o no. fn_varbintohexstr llama a fn_varbintohexsubstring con 1 como el primer argumento internaly.

Como no necesita 0xF, llame al fn_varbintohexsubstring directamente.

+1

Gracias, parece mucho más limpio –

6
convert(varchar(34), HASHBYTES('MD5','Hello World'),1) 

(1 para la conversión de hexadecimal a cadena)

convertir esto a reducir y eliminar 0x desde el inicio de la cadena por subcadena:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32) 

exactamente lo mismo que lo que tenemos en C# después de convertir bytes a la cadena

12

Al contrario de lo que dice David Knight, estas dos alternativas devuelven la misma respuesta en 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)) 

Así que parece que la primera es una mejor opción, a partir de la versión 2008.

0

Con la experiencia personal de usar el siguiente código dentro de un procedimiento almacenado, que HASHED una variable SP puedo confirmar, aunque no documentado, esta combinación funciona al 100% según mi ejemplo:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)