T-SQL을 사용하여 MD5 해시 문자열 생성


답변:



66

HashBytes 사용

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

그러면 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

그러면 F53BD08920E5D25809DF2563EF9C52B6


1
@Brendan, 마지막에 ", 2)"를 생략했습니다.
Ryan Elkins

1
@RyanElkins 나는 Brendan과 같은 결과를 얻었고 ", 2)"를 확실히 포함하고 있습니다. :(
Matthew

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()은 대소 문자를 구분하는 경우에만 필요합니다.
T.Coutlakis

첫 번째 변환이 중요한 것으로 밝혀졌습니다. 이것은의 함수 MD5와 비교하여 동일한 해시를 제공합니다 . 궁금 이유였다 에서 hashs의 다릅니다 및 . 레시피 주셔서 감사합니다 ..MD5()PostgresqlMD5PythonPostgresql
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)


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

나를 위해 작동합니다.


0

문자열이 16 진수가되기를 원한다고 명시 적으로 말하지 않았습니다. 보다 공간 효율적인 기본 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==
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.