Wygeneruj ciąg skrótu MD5 za pomocą T-SQL


Odpowiedzi:



66

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


1
@Brendan, na końcu zostawiłeś „, 2)”.
Ryan Elkins

1
@RyanElkins Otrzymuję ten sam wynik co Brendan iz pewnością uwzględniono w nim „, 2)” :(
Matthew,

20

Rozwiązanie:

SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5','your text')),3,32)

16

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

1
Użycie LOWER()jest konieczne tylko wtedy, gdy rozróżnia się wielkość liter.
T.Coutlakis

Pierwsza konwersja okazuje się ważna. Daje to identyczny MD5hash w porównaniu z MD5()funkcją Postgresql. Zastanawiałem się, dlaczego MD5hasz różni się od Pythoni Postgresql. Dzięki za przepis ...
Ben

14

Dla danych do 8000 znaków użyj:

CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)

Demo

Dla danych binarnych (bez limitu 8000 bajtów) użyj:

CONVERT(VARCHAR(32), master.sys.fn_repl_hash_binary(@binary_data), 2)

Demo


4

Spróbuj tego:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  'email@dot.com' )),3,32) 

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

Rozwiązanie ... zadeklaruj @hash varchar (50) md5.gromweb.com/?string=1111111-2%3B20190110143334%3B001
fernando yevenes

0
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

pracuje dla mnie.


0

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==
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.