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 2013年

1
@RyanElkinsブレンダンと同じ結果が得られ、確かに「、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 2014年

最初の変換が重要であることがわかりました。これにより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


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進数にしたいと明示的に言ったわけではありません。よりスペース効率の良い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==
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.