สร้างสตริงแฮช MD5 ด้วย T-SQL


100

มีวิธีสร้างสตริง MD5 Hash ประเภท varchar (32) โดยไม่ใช้ fn_varbintohexstr หรือไม่

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

ดังนั้นจึงสามารถใช้ในมุมมองที่มีการกำหนดตารางเวลา


คำตอบ:


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

คุณทำสิ่งนี้ใน SQL2005 ได้อย่างไร? มันไม่ส่งคืนสตริงที่เข้ารหัสอย่างถูกต้อง ... ?
Joshua F. Rountree

@JoshuaRountree ดูคำตอบของฉันที่stackoverflow.com/questions/3525997/…
dellasavia

66

ใช้HashBytes

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

ที่จะให้คุณ 0xF53BD08920E5D25809DF2563EF9C52B6

-

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

ที่จะทำให้คุณ F53BD08920E5D25809DF2563EF9C52B6


1
@ เบรนแดนคุณออกจาก ", 2)" ในตอนท้าย
Ryan Elkins

1
@RyanElkins ฉันได้ผลลัพธ์เช่นเดียวกับเบรนแดนและฉันก็รวม ", 2)" ไว้ด้วย :(
Matthew


16

ไม่มีคำตอบอื่นใดที่เหมาะกับฉัน โปรดทราบว่า SQL Server จะให้ผลลัพธ์ที่แตกต่างกันหากคุณส่งสตริงแบบฮาร์ดโค้ดเทียบกับฟีดจากคอลัมน์ในชุดผลลัพธ์ของคุณ ด้านล่างนี้คือความมหัศจรรย์ที่ได้ผลสำหรับฉันในการจับคู่ที่สมบูรณ์แบบระหว่าง SQL Server และ MySql

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

1
การใช้LOWER()เป็นสิ่งที่จำเป็นในกรณีที่มีความละเอียดอ่อนเท่านั้น
T.Coutlakis

การแปลงครั้งแรกกลายเป็นสิ่งสำคัญ นี้จะช่วยให้เหมือนMD5แฮเมื่อเทียบกับการทำงานของMD5() Postgresqlผมก็แปลกใจว่าทำไมMD5hashs แตกต่างจากและ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



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
fernando yevenes

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

เหมาะกับฉัน


0

คุณไม่ได้บอกอย่างชัดเจนว่าคุณต้องการให้สตริงเป็นเลขฐานสิบหก หากคุณเปิดรับการเข้ารหัสสตริง 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.