¿Hay alguna manera de generar una cadena Hash MD5 de tipo varchar (32) sin usar fn_varbintohexstr?
SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)
Entonces podría usarse dentro de una vista con SCHEMABINDING
¿Hay alguna manera de generar una cadena Hash MD5 de tipo varchar (32) sin usar fn_varbintohexstr?
SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)
Entonces podría usarse dentro de una vista con SCHEMABINDING
Respuestas:
CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)
Utilice HashBytes
SELECT HashBytes('MD5', 'email@dot.com')
Eso le dará 0xF53BD08920E5D25809DF2563EF9C52B6
-
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'email@dot.com'),2)
Eso le dará F53BD08920E5D25809DF2563EF9C52B6
Ninguna de las otras respuestas funcionó para mí. Tenga en cuenta que SQL Server dará resultados diferentes si pasa una cadena codificada en lugar de alimentarla desde una columna en su conjunto de resultados. A continuación se muestra la magia que funcionó para mí para dar una combinación perfecta entre SQL Server y MySql
select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
LOWER()
solo es necesario si distingue entre mayúsculas y minúsculas.
MD5
Hash idéntico en comparación con la MD5()
función de Postgresql
. Me preguntaba por MD5
qué se diferencian los hashs de Python
y Postgresql
. Gracias por la receta ..
prueba esto:
select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', 'email@dot.com' )),3,32)
declare @hash nvarchar(50)
--declare @hash varchar(50)
set @hash = '1111111-2;20190110143334;001' -- result a5cd84bfc56e245bbf81210f05b7f65f
declare @value varbinary(max);
set @value = convert(varbinary(max),@hash);
select
SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', '1111111-2;20190110143334;001')),3,32) as 'OK'
,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', @hash)),3,32) as 'ERROR_01'
,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',convert(varbinary(max),@hash))),3,32) as 'ERROR_02'
,SUBSTRING(sys.fn_sqlvarbasetostr(sys.fn_repl_hash_binary(convert(varbinary(max),@hash))),3,32)
,SUBSTRING(sys.fn_sqlvarbasetostr(master.sys.fn_repl_hash_binary(@value)),3,32)
No dijiste explícitamente que querías que la cadena fuera hexadecimal; Si está abierto a la codificación de cadena base 64 más eficiente en cuanto al espacio, y está utilizando SQL Server 2016 o posterior, aquí hay una alternativa:
select SubString(h, 1, 32) from OpenJson(
(select HashBytes('MD5', 'email@dot.com') h for json path)
) with (h nvarchar(max));
Esto produce:
9TvQiSDl0lgJ3yVj75xStg==