Сгенерируйте хеш-строку MD5 с помощью T-SQL

99

Есть ли способ сгенерировать строку хэша MD5 типа varchar (32) без использования fn_varbintohexstr

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

Таким образом, его можно использовать внутри представления с помощью SCHEMABINDING

Кодер скорби
источник

Ответы:

198
CONVERT(VARCHAR(32), HashBytes('MD5', 'email@dot.com'), 2)
Константин Таркус
источник
Как это сделать в SQL2005? Он не возвращает правильно закодированную строку ...?
Джошуа Ф. Рунтри
@JoshuaRountree, см. Мой ответ на stackoverflow.com/questions/3525997/…
dellasavia 06
66

Используйте HashBytes

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

Это даст вам 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Это даст вам F53BD08920E5D25809DF2563EF9C52B6

SQLMenace
источник
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 ...
Jmacinnes
источник
1
Использование LOWER()необходимо только в том случае, если оно чувствительно к регистру.
T.Coutlakis
Первое преобразование оказывается важным. Это дает идентичный MD5хэш по сравнению с MD5()функцией Postgresql. Мне было интересно, почему MD5хеши отличаются от Pythonи Postgresql. Спасибо за рецепт ..
Бен,
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

Slartidan
источник
4

попробуй это:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  'email@dot.com' )),3,32) 
dellasavia
источник
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
Фернандо Йевенес
0
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

работает для меня.

Гита
источник
0

Вы явно не сказали, что хотите, чтобы строка была шестнадцатеричной; если вы открыты для более экономичной кодировки строк base 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==
N8allan
источник