hashCode()
วิธีการของการเรียนแบบบูลจะดำเนินการเช่นนี้
public int hashCode() {
return value ? 1231 : 1237;
}
ทำไมถึงใช้ 1231 และ 1237? ทำไมไม่เป็นอย่างอื่น?
hashCode()
วิธีการของการเรียนแบบบูลจะดำเนินการเช่นนี้
public int hashCode() {
return value ? 1231 : 1237;
}
ทำไมถึงใช้ 1231 และ 1237? ทำไมไม่เป็นอย่างอื่น?
คำตอบ:
1231 และ 1237 เป็นเพียงสอง (ขนาดใหญ่พอ) ตัวเลขที่สำคัญโดยพลการ จำนวนเฉพาะที่มีขนาดใหญ่อีกสองตัวจะทำได้ดี
ทำไมต้องมีรอบ?
สมมติว่าเป็นครั้งที่สองที่เราหยิบตัวเลขคอมโพสิต (ไม่ใช่เฉพาะ) กล่าวว่า 1000 และ 2000 เมื่อใส่ booleans ลงในตารางแฮชจริงและเท็จจะไปลงในถัง1000 % N
รับผิดชอบ2000 % N
(ซึ่งN
คือจำนวนของถัง)
ตอนนี้สังเกตว่า
1000 % 8
ถังเดียวกับ 2000 % 8
1000 % 10
ถังเดียวกับ 2000 % 10
1000 % 20
ถังเดียวกับ 2000 % 20
กล่าวอีกนัยหนึ่งมันจะนำไปสู่การชนกันหลายครั้ง
เนื่องจากการแยกตัวประกอบของ 1000 (2 3 , 5 3 ) และการแยกตัวประกอบของ 2000 (2 4 , 5 3 ) มีปัจจัยร่วมมากมาย ดังนั้นจึงมีการเลือกจำนวนเฉพาะเนื่องจากไม่น่าจะมีปัจจัยร่วมกับขนาดถัง
ทำไมช่วงใหญ่ 2 และ 3 จะไม่ทำเหรอ?
เมื่อคำนวณรหัสแฮชสำหรับออบเจ็กต์แบบผสมมักจะต้องเพิ่มรหัสแฮชสำหรับส่วนประกอบ หากใช้ค่าที่น้อยเกินไปในชุดแฮชที่มีที่เก็บข้อมูลจำนวนมากมีความเสี่ยงที่จะลงเอยด้วยการกระจายวัตถุที่ไม่สม่ำเสมอ
การชนมีความสำคัญหรือไม่? บูลีนมีค่าต่างกันสองค่าใช่หรือไม่
แผนที่สามารถมีบูลีนร่วมกับวัตถุอื่น ๆ นอกจากนี้ตามที่ Drunix ชี้ให้เห็นวิธีทั่วไปในการสร้างฟังก์ชันแฮชของออบเจ็กต์คอมโพสิตคือการนำการใช้งานโค้ดแฮชคอมโพเนนต์ย่อยกลับมาใช้ใหม่ซึ่งในกรณีนี้เป็นการดีที่จะคืนค่าช่วงเวลาที่มาก
คำถามที่เกี่ยวข้อง:
2*1231 = 2462
เก็บข้อมูลอย่างน้อย การชนกันเป็นปัญหาในสถานการณ์เช่นนี้หรือไม่?
นอกจากทั้งหมดที่กล่าวไว้ข้างต้นแล้วยังสามารถเป็นไข่อีสเตอร์ขนาดเล็กจากผู้พัฒนา:
จริง: 1231 => 1 + 2 + 3 + 1 = 7
7 - เป็นเลขนำโชคในประเพณีของยุโรป
เท็จ: 1237 => 1 + 2 + 3 + 7 = 13
13 (aka Devil's โหล) - เลขที่โชคร้าย