Czy istnieje sposób na wygenerowanie ciągu MD5 Hash typu varchar (32) bez użycia fn_varbintohexstr
SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)
Więc może być używany wewnątrz widoku z SCHEMABINDING
Czy istnieje sposób na wygenerowanie ciągu MD5 Hash typu varchar (32) bez użycia fn_varbintohexstr
SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)
Więc może być używany wewnątrz widoku z SCHEMABINDING
Odpowiedzi:
CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)
Użyj HashBytes
SELECT HashBytes('MD5', 'email@dot.com')
To da ci 0xF53BD08920E5D25809DF2563EF9C52B6
-
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'email@dot.com'),2)
To da ci F53BD08920E5D25809DF2563EF9C52B6
Żadna z pozostałych odpowiedzi nie działała dla mnie. Zwróć uwagę, że SQL Server da inne wyniki, jeśli przekażesz ciąg zakodowany na stałe w porównaniu z podawaniem go z kolumny w zestawie wyników. Poniżej znajduje się magia, która zadziałała, aby zapewnić idealne dopasowanie między SQL Server i MySql
select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
LOWER()
jest konieczne tylko wtedy, gdy rozróżnia się wielkość liter.
MD5
hash w porównaniu z MD5()
funkcją Postgresql
. Zastanawiałem się, dlaczego MD5
hasz różni się od Python
i Postgresql
. Dzięki za przepis ...
Spróbuj tego:
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)
Nie powiedziałeś wyraźnie, że chcesz, aby ciąg był szesnastkowy; Jeśli jesteś otwarty na bardziej efektywne miejsce w kodowaniu ciągów bazowych 64 i używasz SQL Server 2016 lub nowszego, oto alternatywa:
select SubString(h, 1, 32) from OpenJson(
(select HashBytes('MD5', 'email@dot.com') h for json path)
) with (h nvarchar(max));
To daje:
9TvQiSDl0lgJ3yVj75xStg==