Створити хеш-рядок MD5 за допомогою T-SQL


99

Чи є спосіб генерувати рядок MD5 Hash типу varchar (32) без використання fn_varbintohexstr

SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'email@dot.com')), 3, 32)

Таким чином, його можна використовувати всередині подання за допомогою SCHEMABINDING


Дивіться також stackoverflow.com/questions/35200452/…
Бен

Відповіді:



66

Використовуйте HashBytes

SELECT HashBytes('MD5', 'email@dot.com')

Це дасть вам 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Це дасть вам F53BD08920E5D25809DF2563EF9C52B6


1
@Brendan, ти залишив ", 2)" наприкінці.
Райан Елкінс

1
@RyanElkins Я отримую той же результат, що і Брендан, і я, безумовно, включаю ", 2)" :(
Метью

20

Рішення:

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

16

Жодна з інших відповідей не працювала на мене. Зауважте, що SQL Server дасть різні результати, якщо ви передасте жорстко закодовану рядок проти подачі її з стовпця в наборі результатів. Нижче наведено магію, яка допомогла мені забезпечити ідеальну відповідність між SQL Server та MySql

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...

1
Використання LOWER()необхідне лише у випадках, коли воно чутливе до регістру.
Т.Кутлакіс

Перше перетворення виявляється важливим. Це дає ідентичний MD5Hash порівняно з MD5()функцією Postgresql. Мені було цікаво, чому MD5хеш відрізняється від Pythonта Postgresql. Дякую за рецепт ..
Ben

14

Для даних довжиною до 8000 символів використовуйте:

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

Demo

Для двійкових даних (без обмеження 8000 байт) використовуйте:

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

Demo


4

спробуйте це:

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)

Рішення ... оголосити @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;

працює для мене.


0

Ви прямо не сказали, що хочете, щоб рядок був шістнадцятковим; якщо ви відкриті для більш просторого кодування базового рядка 64 і використовуєте SQL Server 2016 або пізнішої версії, ось альтернатива:

select SubString(h, 1, 32) from OpenJson(
    (select HashBytes('MD5', 'email@dot.com') h for json path)
) with (h nvarchar(max));

Це дає:

9TvQiSDl0lgJ3yVj75xStg==
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.