การเลือกอัลกอริทึมที่เหมาะสมในฟังก์ชัน HashBytes


20

เราจำเป็นต้องสร้างค่าแฮชของข้อมูล nvarchar เพื่อการเปรียบเทียบ มีอัลกอริทึมแฮชหลายอย่างใน T-SQL แต่มีวิธีไหนที่ดีที่สุดในการเลือกจากสถานการณ์นี้

เราต้องการให้มั่นใจว่าความเสี่ยงของการมีค่าแฮชที่ซ้ำกันสำหรับค่า nvarchar ที่ต่างกันสองค่านั้นเป็นขั้นต่ำ จากการวิจัยของฉันทางอินเทอร์เน็ต MD5 นั้นดีที่สุด นั่นถูกต้องใช่ไหม? MSDN บอกเรา (ลิงค์ด้านล่าง) เกี่ยวกับอัลกอริธึมที่มีอยู่ แต่ไม่มีคำอธิบายใดเกี่ยวกับเงื่อนไขใดบ้าง

HASHBYTES (Transact-SQL)

เราจำเป็นต้องเข้าร่วมสองตารางในสองคอลัมน์ nvarchar (สูงสุด) ในขณะที่คุณสามารถจินตนาการแบบสอบถามใช้เวลาในการดำเนินการ เราคิดว่าจะเป็นการดีกว่าที่จะเก็บค่าแฮชของข้อมูล nvarchar (สูงสุด) แต่ละรายการและทำการรวมเข้ากับค่าแฮชมากกว่าค่า nvarchar (สูงสุด) ซึ่งเป็น blobs คำถามคืออัลกอริธึมแฮชใดที่ให้ความแตกต่างดังนั้นเราจึงไม่เสี่ยงต่อการมีค่าแฮชหนึ่งค่าสำหรับมากกว่าหนึ่ง nvarchar (สูงสุด)

คำตอบ:


18

HASHBYTESฟังก์ชั่นใช้เวลาเพียงไม่ถึง 8000 ไบต์เป็น input เนื่องจากอินพุตของคุณอาจมีขนาดใหญ่กว่านั้นการทำซ้ำในช่วงของฟิลด์ที่ถูกแฮชจะทำให้เกิดการชนโดยไม่คำนึงถึงอัลกอริทึมที่เลือก พิจารณาช่วงของข้อมูลที่คุณวางแผนที่จะใช้อย่างระมัดระวัง - การใช้อักขระ 4000 ตัวแรกเป็นตัวเลือกที่ชัดเจนแต่อาจไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับข้อมูลของคุณ

ในกรณีใด ๆ เพราะฟังก์ชั่นแฮชคืออะไรถึงแม้ว่าอินพุตเป็น 8000 ไบต์หรือน้อยกว่าวิธีเดียวที่จะรับรองความถูกต้องได้ 100% ในผลลัพธ์คือการเปรียบเทียบค่าฐานในบางจุด (อ่าน: ไม่จำเป็นต้องมาก่อน ) ระยะเวลา

ธุรกิจจะกำหนดว่าต้องการความแม่นยำ 100% หรือไม่ สิ่งนี้จะบอกคุณว่า (a) การเปรียบเทียบค่าฐานนั้นจำเป็นต้องใช้หรือ (b) คุณควรพิจารณาที่ จะไม่เปรียบเทียบค่าฐาน - ความแม่นยำเท่าไหร่ที่ควรแลกกับประสิทธิภาพ

แม้ว่าการชนกันของแฮชอาจเกิดขึ้นได้ในชุดอินพุตที่ไม่ซ้ำกัน แต่มีน้อยมากโดยไม่คำนึงถึงอัลกอริธึมที่เลือก แนวคิดทั้งหมดของการใช้ค่าแฮชในสถานการณ์นี้คือการ จำกัด ผลลัพธ์การเข้าร่วมให้แคบลงได้อย่างมีประสิทธิภาพมากขึ้นโดยไม่จำเป็นต้องมาถึงผลลัพธ์ชุดสุดท้ายทันที อีกครั้งเพื่อความแม่นยำ 100% นี่ไม่ใช่ขั้นตอนสุดท้ายในกระบวนการ สถานการณ์นี้ไม่ได้ใช้การแปลงแป้นพิมพ์เพื่อวัตถุประสงค์ในการเข้ารหัสดังนั้นอัลกอริทึมเช่น MD5 จะทำงานได้ดี

มันเป็นเรื่องยากมากสำหรับฉันที่จะแสดงให้เห็นถึงการย้ายอัลกอริทึม SHA-x เพื่อวัตถุประสงค์ "ความถูกต้อง" เพราะถ้าธุรกิจกำลังจะออกนอกลู่นอกทางเกี่ยวกับความเป็นไปได้ของการชนกันของ MD5 โอกาสพวกเขาก็จะประหลาดใจด้วยเช่นกัน อัลกอริทึม SHA-x ไม่สมบูรณ์แบบเช่นกัน พวกเขาจะต้องทำใจด้วยความไม่ถูกต้องเล็กน้อยหรือคำสั่งว่าแบบสอบถามนั้นถูกต้อง 100% และอยู่กับผลกระทบทางเทคนิคที่เกี่ยวข้อง ฉันคิดว่าถ้า CEO นอนหลับได้ดีขึ้นในเวลากลางคืนโดยรู้ว่าคุณใช้ SHA-x แทนที่จะเป็น MD5 ก็ดี มันยังไม่ได้มีความหมายอะไรมากนักจากมุมมองทางเทคนิคในกรณีนี้

การพูดของประสิทธิภาพหากตารางเป็นแบบอ่านส่วนใหญ่และผลการเข้าร่วมเป็นสิ่งจำเป็นบ่อยครั้งให้ลองใช้มุมมองที่จัดทำดัชนีเพื่อลดความจำเป็นในการคำนวณการเข้าร่วมทั้งหมดทุกครั้งที่มีการร้องขอ แน่นอนว่าคุณต้องแลกกับพื้นที่เก็บข้อมูล แต่อาจจะคุ้มค่าสำหรับการปรับปรุงประสิทธิภาพโดยเฉพาะอย่างยิ่งหากจำเป็นต้องมีความแม่นยำ 100%

สำหรับการอ่านเพิ่มเติมเกี่ยวกับการสร้างดัชนีค่าสตริงแบบยาวฉันเผยแพร่บทความที่อธิบายถึงตัวอย่างของวิธีการทำสิ่งนี้สำหรับตารางเดียวและนำเสนอสิ่งที่ต้องพิจารณาเมื่อพยายามสถานการณ์สมมติแบบเต็มในคำถามนี้


8

MD5 ควรจะใช้ได้และเอาท์พุทสามารถเก็บไว้ในไบนารี (16) ความน่าจะเป็นของการชน (ดูวันเกิดความขัดแย้ง ) ยังคงต่ำมากแม้จะมีขนาดตัวอย่างทางกายภาพขนาดใหญ่ เอาต์พุตของ SHA-1 ใช้เวลา 20 ไบต์และเอาต์พุตของ SHA-256 จะมีขนาด 32 ไบต์ หากคุณไม่มีบันทึกจำนวนมากที่ความน่าจะเป็นในการเกิดวันเกิดของคุณมีความสำคัญ (เป็นไปไม่ได้ทางร่างกายหรืออย่างน้อยก็ไม่สามารถทำได้ด้วยเทคโนโลยีฮาร์ดแวร์ปัจจุบัน) มันอาจจะไม่เป็นไร


4

ฉันจะใช้ SHA-1 เป็นอัลกอริธึมที่ดีกว่าและมีความคาดหวังในการชนน้อยที่สุด (2 ^ 51 เทียบกับ MD5 ซึ่งเป็น 2 ^ 20.96) MD5 ยังได้รับการพิสูจน์แล้วว่ามีความเสี่ยงต่อการชนในบางสถานการณ์

แหล่งที่มา:

http://en.wikipedia.org/wiki/SHA-1 http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysis http://en.wikipedia.org/wiki/MD5


0

ฉันไม่เห็นสิ่งนี้พูดถึงในคำตอบ แต่ต่อMSDN :

เริ่มต้นด้วย SQL Server 2016 (13.x) อัลกอริทึมทั้งหมดที่ไม่ใช่ SHA2_256 และ SHA2_512 จะถูกคัดค้าน อัลกอริทึมที่เก่ากว่า (ไม่แนะนำ) จะยังคงทำงานต่อไป แต่จะเพิ่มเหตุการณ์การคัดค้าน

ฉันถามคำถามที่คล้ายกันดังนั้นมันขึ้นอยู่กับคุณว่าคุณต้องการใช้ฟังก์ชันที่เลิกใช้แล้วเช่น MD5 (ถ้าคุณอยู่ในปี 2016+) คุณสามารถทำการทดสอบเพื่อดูว่ามีความแตกต่างในการจัดเก็บและประสิทธิภาพระหว่าง MD5 และ SHA2 อย่างไร

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