หากต้องการขยายคำตอบของ David Richerby คำว่า " ฟังก์ชันแฮช " จะมีการใช้งานมากเกินไป บ่อยครั้งเมื่อเราพูดถึงฟังก์ชั่นแฮชเราคิดว่า MD5, SHA-1 หรือบางอย่างเช่น.hashCode()
วิธีของ Java ซึ่งเปลี่ยนอินพุตให้เป็นตัวเลขเดียว อย่างไรก็ตามโดเมนของหมายเลขนี้ (เช่นคือค่าสูงสุด) นั้นไม่น่าจะมีขนาดเท่ากันกับ hashtable ที่คุณพยายามจัดเก็บข้อมูล (MD5 คือ 16 ไบต์ SHA-1 คือ 20 ไบต์และ.hashCode()
เป็นint
- 4 bytes)
ดังนั้นคำถามของคุณเกี่ยวกับขั้นตอนต่อไป - เมื่อเรามีฟังก์ชั่นแฮชที่สามารถแมปอินพุตแบบสุ่มกับตัวเลขเราจะใส่โครงสร้างข้อมูลที่มีขนาดเฉพาะได้อย่างไร ด้วยฟังก์ชั่นอื่นเรียกอีกอย่างว่า "ฟังก์ชั่นแฮช"!
ตัวอย่างเล็ก ๆ น้อย ๆ ของฟังก์ชั่นดังกล่าวเป็นแบบโมดูโล ; คุณสามารถแมปขนาดที่กำหนดเองไปยังดัชนีเฉพาะในอาเรย์ด้วยโมดูโลได้อย่างง่ายดาย สิ่งนี้ถูกนำเสนอใน CLRS ในฐานะ "วิธีการหาร":
kม.kม.
h ( k ) = kม.
...
ม.ม.m = 2พีh ( k )พีk
~ รู้เบื้องต้นเกี่ยวกับอัลกอริทึม, §11.3.1 - CLRS
ม.
Java HashMap
ใช้รุ่นที่ปรับเปลี่ยนของวิธีการหารที่ทำขั้นตอนการประมวลผลล่วงหน้าเพื่อบัญชีสำหรับ.hashCode()
การใช้งานที่อ่อนแอเพื่อให้สามารถใช้อาร์เรย์ที่มีขนาดกำลังไฟสอง คุณสามารถเห็นสิ่งที่เกิดขึ้นใน.getEntry()
วิธีการ (ความเห็นเป็นของฉัน):
// hash() transforms key.hashCode() to protect against bad hash functions
int hash = (key == null) ? 0 : hash(key.hashCode());
// indexOf() converts the resulting hash to a value between 0 and table.length-1
for (Entry<K,V> e = table[indexFor(hash, table.length)];
...
Java 8 นำมาเขียนใหม่HashMap
ซึ่งเร็วยิ่งขึ้น แต่อ่านยากขึ้นเล็กน้อย แต่ใช้หลักการทั่วไปเดียวกันกับการค้นหาดัชนีอย่างไรก็ตาม