programing

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

skycolor 2023. 5. 27. 09:58
반응형

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

fn_varbintohexstr를 사용하지 않고 varchar(32) 유형의 MD5 해시 문자열을 생성하는 방법이 있습니까?

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

따라서 SCHEMABINDING을 사용하여 뷰 내부에서 사용할 수 있습니다.

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

해시 바이트 사용

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

그러면 0xF53을 얻을 수 있습니다.BD08920E5D25809DF2563EF9C52B6

-

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

그러면 F53이 나옵니다.BD08920E5D25809DF2563EF9C52B6

솔루션:

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

다른 어떤 대답도 저에게는 통하지 않았습니다.하드 코딩된 문자열을 전달하는 경우와 결과 집합의 열에서 문자열을 피드하는 경우 SQL Server는 다른 결과를 제공합니다.다음은 SQL Server와 MySql을 완벽하게 일치시키는 마법입니다.

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

최대 8,000자의 데이터인 경우 다음을 사용합니다.

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

Demo

이진 데이터(8000바이트 제한 없음)의 경우 다음을 사용합니다.

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

Demo

사용해 보십시오.

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  'email@dot.com' )),3,32) 
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

저한테는 효과가 있어요.

문자열을 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==
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)

대부분의 솔루션이 제대로 작동하지 않습니다. 이는 10개의 다른 텍스트 열 조합을 통해 고유한 결과를 반환하도록 신중하게 테스트됩니다(KEY CHANGE: convert to varchar(X)). 여기서 x는 문자열의 최대 길이가 4000 미만인 경우 다른 방법을 사용하십시오.

LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar(4000), EmailAddress)), 2))

언급URL : https://stackoverflow.com/questions/3525997/generate-md5-hash-string-with-t-sql

반응형