Hasilkan string hash MD5 dengan T-SQL


Jawaban:



66

Gunakan HashBytes

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

Itu akan memberi Anda 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

Itu akan memberi Anda F53BD08920E5D25809DF2563EF9C52B6


1
@ Brendan, Anda meninggalkan ", 2)" di akhir.
Ryan Elkins

1
@RyanElkins Saya mendapatkan hasil yang sama dengan Brendan, dan saya pasti termasuk ", 2)" :(
Matius

20

Larutan:

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

16

Tidak ada jawaban lain yang berhasil untuk saya. Perhatikan bahwa SQL Server akan memberikan hasil yang berbeda jika Anda mengirimkan string hard-code versus memberinya makan dari kolom di set hasil Anda. Di bawah ini adalah keajaiban yang berhasil bagi saya untuk memberikan kecocokan yang sempurna antara SQL Server dan MySql

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

1
Penggunaan LOWER()hanya diperlukan jika peka huruf besar / kecil.
T.Coutlakis

Konversi pertama ternyata penting. Ini memberikan MD5Hash identik dibandingkan dengan MD5()fungsi Postgresql. Saya heran mengapa MD5hash berbeda dari Pythondan Postgresql. Terima kasih untuk resepnya ..
Ben

14

Untuk data hingga 8000 karakter, gunakan:

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

Demo

Untuk data biner (tanpa batas 8000 byte) gunakan:

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

Demo


4

coba ini:

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;

bekerja untuk saya.


0

Anda tidak secara eksplisit mengatakan Anda ingin string menjadi hex; Jika Anda terbuka untuk pengkodean string base 64 yang lebih hemat ruang, dan Anda menggunakan SQL Server 2016 atau yang lebih baru, berikut adalah alternatifnya:

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

Ini menghasilkan:

9TvQiSDl0lgJ3yVj75xStg==
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.