บทความ Wikipedia เกี่ยวกับฟังก์ชั่นแฮชนั้นดีมาก แต่ฉันจะให้เวลา
แฮชคืออะไร
"Hash" เป็นคำที่กว้างที่มีความหมายอย่างเป็นทางการที่แตกต่างกันในบริบทที่แตกต่างกัน ไม่มีคำตอบที่สมบูรณ์แบบสำหรับคำถามของคุณ ฉันจะอธิบายแนวคิดพื้นฐานทั่วไปและกล่าวถึงประเพณีที่พบบ่อยที่สุดของคำศัพท์
"hash" เป็นฟังก์ชันเรียกว่าฟังก์ชัน hash
ที่ใช้เป็นวัตถุอินพุตและส่งออกสตริงหรือตัวเลข วัตถุอินพุตมักเป็นสมาชิกของชนิดข้อมูลพื้นฐานเช่นสตริงจำนวนเต็มหรือใหญ่กว่าที่ประกอบด้วยวัตถุอื่น ๆ เช่นโครงสร้างที่ผู้ใช้กำหนด ผลลัพธ์มักเป็นตัวเลขหรือสตริง คำนาม "hash" มักจะอ้างถึงเอาต์พุตนี้ คำกริยา "hash" มักจะหมายถึง "ใช้ฟังก์ชั่นแฮช" คุณสมบัติหลักที่ฟังก์ชันแฮชควรมีคือ:ชั่วโมง
- มันควรจะง่ายต่อการคำนวณและ
- ผลลัพธ์ควรมีขนาดค่อนข้างเล็ก
ตัวอย่าง:
สมมติว่าเราต้องการแฮชตัวเลขในช่วงตั้งแต่ 0 ถึง 999,999,999 ถึงตัวเลขระหว่าง 0 ถึง 99 ฟังก์ชันแฮชธรรมดาหนึ่งฟังก์ชันสามารถh ( x ) = xพอควร100100
คุณสมบัติเพิ่มเติมทั่วไป:
ขึ้นอยู่กับกรณีใช้งานเราอาจต้องการให้ฟังก์ชันแฮชตอบสนองคุณสมบัติเพิ่มเติม นี่คือคุณสมบัติเพิ่มเติมทั่วไปบางส่วน:
ความสม่ำเสมอ : บ่อยครั้งที่เราต้องการให้แฮชของวัตถุแตกต่างกัน ยิ่งไปกว่านั้นเราอาจต้องการให้แฮช "กระจายออกไป" ถ้าฉันต้องการแฮชวัตถุบางอย่างลงไปใน 100 buckets (ดังนั้นผลลัพธ์ของฟังก์ชันแฮชของฉันคือตัวเลขตั้งแต่ 0-99) ดังนั้นฉันมักจะหวังว่าวัตถุประมาณ 1/100 จะลงจอดใน bucket 0, ประมาณ 1/100 land ใน ถัง 1 และอื่น ๆ
การต้านทานการชนกันของการเข้ารหัส : บางครั้งสิ่งนี้ถูกนำมาใช้มากยิ่งขึ้นตัวอย่างเช่นในการเข้ารหัสฉันอาจต้องการฟังก์ชันแฮชซึ่งเป็นการยากที่คอมพิวเตอร์จะคำนวณหาคู่ปรับที่แตกต่างกันที่แมปไปยังเอาต์พุตเดียวกัน
การบีบอัด : ฉันมักต้องการแฮชอินพุตขนาดใหญ่โดยพลการลงไปในเอาต์พุตขนาดคงที่หรือจำนวนที่คงที่ของถัง
ความมุ่งมั่น : ฉันอาจต้องการฟังก์ชั่นแฮชที่เอาท์พุทไม่เปลี่ยนแปลงระหว่างการทำงานนั่นคือเอาท์พุทของฟังก์ชั่นแฮชบนวัตถุเดียวกันจะยังคงเหมือนเดิม นี่อาจดูเหมือนขัดแย้งกับความสม่ำเสมอด้านบน แต่วิธีแก้ไขปัญหาหนึ่งคือการเลือกฟังก์ชันแฮชแบบสุ่มหนึ่งครั้งและไม่เปลี่ยนระหว่างการรัน
แอพพลิเคชั่นบางตัว
แอปพลิเคชันทั่วไปหนึ่งอยู่ในโครงสร้างข้อมูลเช่นตารางแฮชซึ่งเป็นวิธีการใช้พจนานุกรม ที่นี่คุณจัดสรรหน่วยความจำพูด 100 "ถัง"; จากนั้นเมื่อได้รับการขอให้เก็บคู่ (คีย์, ค่า) ในพจนานุกรมคุณจะต้องกดคีย์ลงในหมายเลข 0-99 และเก็บคู่ไว้ในที่เก็บข้อมูลที่สอดคล้องกันในหน่วยความจำ จากนั้นเมื่อคุณถูกขอให้ค้นหาคีย์คุณแฮชคีย์เป็นหมายเลข 0-99 ด้วยฟังก์ชันแฮชเดียวกันและตรวจสอบที่เก็บข้อมูลนั้นเพื่อดูว่ามีคีย์นั้นอยู่ในนั้นหรือไม่ ถ้าเป็นเช่นนั้นคุณจะคืนค่าของมัน
โปรดทราบว่าคุณยังสามารถใช้พจนานุกรมในรูปแบบอื่นเช่นด้วยแผนภูมิการค้นหาแบบไบนารี (หากวัตถุของคุณเปรียบได้)
แอปพลิเคชั่นที่ใช้งานได้อีกอย่างหนึ่งคือ checksums ซึ่งเป็นวิธีการตรวจสอบว่าสองไฟล์เหมือนกัน (ตัวอย่างเช่นไฟล์นั้นไม่ได้เสียหายจากเวอร์ชันก่อนหน้า) เนื่องจากฟังก์ชันแฮชไม่น่าจะเป็นไปได้มากในการจับคู่สองอินพุตกับเอาต์พุตเดียวกันคุณจึงคำนวณและเก็บแฮชของไฟล์แรกซึ่งมักจะแสดงเป็นสตริง แฮชนี้มีขนาดเล็กมากอาจมีอักขระ ASCII เพียงไม่กี่ตัว จากนั้นเมื่อคุณได้รับไฟล์ที่สองคุณจะแฮชและตรวจสอบว่าเอาต์พุตเหมือนกัน ถ้าเป็นเช่นนั้นเกือบแน่นอนว่าเป็นไฟล์เดียวกันกับไบต์ต่อไบต์
แอปพลิเคชั่นอื่นอยู่ในวิทยาการเข้ารหัสลับซึ่งแฮชเหล่านี้ควรจะยากที่จะ "สลับกลับ" - นั่นคือเนื่องจากได้รับเอาท์พุทและฟังก์ชันแฮชมันควรจะยากที่จะคำนวณหาอินพุต การใช้สิ่งนี้เพื่อใช้เป็นรหัสผ่าน: แทนที่จะเก็บรหัสผ่านไว้เองคุณเก็บแฮชการเข้ารหัสของรหัสผ่าน (อาจมีส่วนผสมอื่น ๆ ) จากนั้นเมื่อผู้ใช้ป้อนรหัสผ่านคุณคำนวณแฮชและตรวจสอบว่าตรงกับแฮชที่ถูกต้อง ถ้าเป็นเช่นนั้นคุณบอกว่ารหัสผ่านถูกต้อง (ตอนนี้แม้แต่คนที่สามารถค้นหาและค้นหาแฮชที่บันทึกไว้บนเซิร์ฟเวอร์ไม่ได้มีเวลาที่แกล้งทำเป็นผู้ใช้) แอปพลิเคชันนี้อาจเป็นกรณีที่เอาต์พุตมีความยาวหรือยาวกว่าอินพุทเนื่องจาก อินพุตสั้นมาก