Pregunta

Quiero obtener el Hash MD5 de una cadena de valor en SQL Server 2005.Puedo hacer esto con el siguiente comando:

SELECT HashBytes('MD5', 'HelloWorld')

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

Hay alguna SQL basado en la solución?

¿Fue útil?

Solución

He encontrado la solución en otro lugar:

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

Otros consejos

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

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

De hecho fn_varbintohexstr llamadas fn_varbintohexsubstring internamente.El primer argumento de fn_varbintohexsubstring lo dice para agregar 0xF como el prefijo o no. fn_varbintohexstr llamadas fn_varbintohexsubstring con 1 como primer argumento internaly.

Porque no necesitas 0xF, llame fn_varbintohexsubstring directamente.

Contrariamente a lo que David Caballero dice, estas dos alternativas de devolver 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.

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

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

convertir esta para bajar y quitar 0x desde el inicio de la cadena subcadena:

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

exactamente el mismo como lo que tenemos en C# después de la conversión de bytes de la cadena

Con la experiencia personal con el siguiente código dentro de un Procedimiento Almacenado el cual Hash de un SP Variable puedo confirmar, aunque indocumentados, esta combinación funciona 100% como por ejemplo:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top