แปลง HashBytes เป็น VarChar


127

ฉันต้องการรับ MD5 Hash ของค่าสตริงใน SQL Server 2005 ฉันทำสิ่งนี้ด้วยคำสั่งต่อไปนี้:

SELECT HashBytes('MD5', 'HelloWorld')

อย่างไรก็ตามสิ่งนี้จะส่งคืน VarBinary แทนค่า VarChar ถ้าฉันพยายามแปลง0x68E109F0F40CA72A15E05CC22786F8E6เป็น VarChar ฉันจะได้รับhá ðô§*à\Â'†øæแทน68E109F0F40CA72A15E05CC22786F8E6ไฟล์.

มีโซลูชันที่ใช้ SQL หรือไม่?

ใช่

คำตอบ:


147

ฉันพบวิธีแก้ปัญหาอื่นแล้วโดยที่:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

19
fn_varbintohexstr ไม่ใช่ฟังก์ชันเอกสาร ใช้ CONVERT (Char, @ value, 2)
Cheburek

ฉันเพิ่งได้รับ varbinary เล็กน้อยเนื่องจากต้องการวิธีการอัปเดตในคลังสินค้า สิ่งนี้ได้ผลอย่างมีเสน่ห์! ขอบคุณ ...
nitefrog

วิธีนี้ช้ามากใช้ฟังก์ชันที่ไม่มีเอกสารและใช้ไม่ได้ใน Azure ไม่เท่. ใช้ Convert แทน!
Rocklan

4
CONVERT () ไม่ทำงานใน SQL 2005 หากคุณใช้ SQL 2008 ขึ้นไปให้ใช้ CONVERT () ทั้งหมดที่คุณต้องการ น่าเศร้าที่ฉันไม่ทราบคำสั่งเดียวซึ่งจะใช้ได้กับ SQL ทุกเวอร์ชันดังนั้นให้ทำการตรวจสอบเวอร์ชันที่บ้าคลั่งในสคริปต์ของคุณหรือเพียงแค่จดบันทึกไว้ที่ใดที่หนึ่งที่คุณต้องแก้ไขฟังก์ชันหากคุณอัปเกรดเวอร์ชัน SQL
Carl Bussema

5
CONVERT (Char, @ value, 2) เอาต์พุต 32 ไบต์เท่านั้น - หากคุณทำสิ่งนี้กับแฮช sha1 คุณจะตัดทอนคุณต้องแปลง (char (48), @ value, 2) เพื่อให้เอาต์พุตที่เหมาะสม
Andrew Hill

83
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

4
ใช้งานได้ใน SQL Azure สำหรับ SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor

4
ไม่จำเป็นต้องใช้ nvarchar โดยไม่จำเป็น
Ian Kemp

3
คำถามระบุว่า SQL Server 2005 และถ้าคุณทำตามคำแนะนำข้างต้น (และอาจเป็นเวอร์ชันอื่นด้วย) พวกเขาจะไม่ทำตามที่ขอ คุณได้รับอักขระใดก็ตามที่ไบต์เทียบเท่าไม่ใช่ไบต์เป็นสตริงฐานสิบหกซึ่งเป็นสิ่งที่ขอ GateKiller และ Xarqron ให้คำตอบว่าได้ผล
David Knight

ฉันจะอ่านเกี่ยวกับรูปแบบการแปลงเหล่านี้ได้ที่ไหน 2ในกรณีนี้ซึ่งถูกส่งผ่านเป็นพารามิเตอร์ และจะทำให้เทียบเท่ากับรหัส C # ได้อย่างไร? ฉันควรเลือกการเข้ารหัสแบบใด
Dmytro Zhluktenko

31

ใช้master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)แทนmaster.dbo.fn_varbintohexstrแล้วsubstringingผลลัพธ์

ในความเป็นจริงfn_varbintohexstrโทรfn_varbintohexsubstringภายใน อาร์กิวเมนต์แรกของfn_varbintohexsubstringบอกให้เพิ่ม0xFเป็นคำนำหน้าหรือไม่ fn_varbintohexstrเรียกfn_varbintohexsubstringด้วย1เป็นอาร์กิวเมนต์แรกภายใน

เพราะคุณไม่จำเป็นต้อง0xFโทรfn_varbintohexsubstringโดยตรง


27

ตรงกันข้ามกับสิ่งที่David Knightกล่าวทางเลือกทั้งสองนี้จะตอบสนองเหมือนกันใน MS SQL 2008:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

ดูเหมือนว่าอันแรกจะเป็นตัวเลือกที่ดีกว่าเริ่มตั้งแต่เวอร์ชัน 2008


อย่าพิมพ์สิ่งนี้โดยไม่ได้ตั้งใจซึ่งจะให้คำตอบที่แตกต่างกันเล็กน้อย! ... แปลง (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate

13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 สำหรับการแปลงเลขฐานสิบหกเป็นสตริง)

แปลงค่านี้ให้ต่ำกว่าและลบ 0x จากจุดเริ่มต้นของสตริงโดยสตริงย่อย:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

เหมือนกับสิ่งที่เราได้รับใน C # หลังจากแปลงไบต์เป็นสตริง


2

ด้วยประสบการณ์ส่วนตัวในการใช้รหัสต่อไปนี้ภายใน Stored Procedure ซึ่งมีการแฮชตัวแปร SP ฉันสามารถยืนยันได้แม้ว่าจะไม่มีเอกสาร แต่ชุดค่าผสมนี้ทำงานได้ 100% ตามตัวอย่างของฉัน:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)

-3

การเปลี่ยนประเภทข้อมูลเป็น varbinary ดูเหมือนจะได้ผลดีที่สุดสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.