การจำแนกฟังก์ชันแฮช


9

บนอินเทอร์เน็ตฉันเจอคำถามนี้:

จำแนกฟังก์ชั่นการแฮชตามวิธีการต่างๆที่พบค่าคีย์

ด้วยคำตอบเช่น

  • วิธีการโดยตรง
  • วิธีการลบ
  • วิธีการโมดูโล
  • วิธีการสกัดหลัก
  • วิธีการของ Mid-Square
  • วิธีการพับ
  • วิธีการสุ่มหลอก

ซึ่งฉันพบว่าแปลก ฉันคิดว่าฉันรู้มากเกี่ยวกับการคร่ำครวญ แต่นี่เป็นคำที่ไม่มีความหมายสำหรับฉันใครจะอธิบายได้บ้าง

คำตอบ:


4

พวกเขาเป็นวิธีการเปลี่ยน hashcode เป็นดัชนีของอาร์เรย์ที่มีค่า สมมติว่าคุณมีแฮ็ชโค้ดจำนวน 0x12345678 จำนวนมากมากและคุณไม่น่าจะมีขนาดเท่านี้ ถ้าคุณทำคุณก็สามารถทำได้

Value = array[0x12345678];

และต้องทำ (วิธีการโดยตรง)

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

Value = array[hashcode & 0xffff];

หรือดัดแปลง hashcode เทียบกับขนาดอาร์เรย์

Value = array[hashcode % array.size()]; // modulo division

ฯลฯ

แก้ไข: ลิงค์นี้อาจช่วยได้


ขอบคุณนั่นแหล่ะ - ลิงค์น่าจะเป็นที่มาของไอ้นี่ มันยังไม่มีเหตุผลที่ผสมหลาย ๆ สิ่งเข้าด้วยกัน: 1. คำนวณ hashCode จากคีย์ (เช่นการพับและการเพิ่ม) 2. การปรับปรุง (= การทา) การแฮช (เช่นกลางสี่เหลี่ยม) 3. การแมป แฮชไปยังดัชนี (เช่นโมดูลัส, "&")
maaartinus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.