เนื้อหาหลักของบทความนี้เป็นวิธีการประเมินที่ถูกต้องของ HashCode ใน Java ดังนี้
มีการเพิ่มประสิทธิภาพสำหรับรายการแฮชที่สามารถแคชรหัสแฮชของวัตถุได้ หากรหัสแฮชไม่ตรงกันจะไม่ตรวจสอบความเท่าเทียมกันของวัตถุและพิจารณาโดยตรงว่าเป็นวัตถุที่แตกต่างกัน หากรหัสแฮช (hashcode) เท่ากันมันจะตรวจพบว่าวัตถุนั้นเท่ากันหรือไม่
หากวัตถุมีรหัสแฮชเดียวกัน (hashcode) พวกเขาจะถูกแมปกับถังแฮชเดียวกัน หาก HashCode ของวัตถุทั้งหมดใน hashlist เหมือนกัน Hashlist จะเสื่อมสภาพลงในรายการที่เชื่อมโยงซึ่งจะช่วยลดประสิทธิภาพการสืบค้นได้อย่างมาก
ฟังก์ชั่นแฮชที่ดีมักจะ "สร้างรหัสแฮชที่ไม่เท่ากันสำหรับวัตถุที่ไม่ต้องการรอ" ตามหลักการแล้วฟังก์ชั่นแฮชควรแจกจ่ายอินสแตนซ์อย่างสม่ำเสมอในชุดที่ไม่ต้องการให้แฮชเป็นไปได้ทั้งหมด แต่ก็ยากมากที่จะบรรลุสถานการณ์ในอุดมคตินี้อย่างเต็มที่ นี่คือวิธีการแฮชที่ค่อนข้างง่ายและมีประสิทธิภาพ:
1. บันทึกค่าคงที่ที่ไม่ใช่ศูนย์เช่น 17 ในตัวแปรประเภท int ที่เรียกว่าผลลัพธ์
2. สำหรับแต่ละโดเมนคีย์ f ในวัตถุ ( หมายถึงแต่ละโดเมนที่เกี่ยวข้องในวิธี Equals ) ให้ทำตามขั้นตอนต่อไปนี้:
result = 31 * result + c; การดำเนินการคูณคือการได้รับฟังก์ชั่นแฮชที่ดีกว่า ตัวอย่างเช่นหากฟังก์ชั่นแฮชของสตริงละเว้นการคูณแล้วสตริงทั้งหมดที่มีลำดับตัวอักษรที่แตกต่างกันจะมีรหัสแฮชเดียวกัน เหตุผลที่ 31 ถูกเลือกที่นี่เป็นเพราะมันเป็นจำนวนที่สำคัญคี่ หากตัวคูณเป็นจำนวนคู่และการคูณล้นข้อมูลจะหายไปเนื่องจากการคูณด้วย 2 นั้นเทียบเท่ากับการกระจัด ประโยชน์ของการใช้ตัวเลขที่สำคัญไม่ชัดเจน แต่ผลลัพธ์แฮชถูกใช้ตามอัตภาพเพื่อคำนวณผลลัพธ์แฮช 31 มีคุณสมบัติที่ดีนั่นคือการใช้กะและการลบแทนการคูณซึ่งสามารถบรรลุประสิทธิภาพที่ดีขึ้น: 31 * i == (i << 5) - i VMS ของวันนี้สามารถใช้การเพิ่มประสิทธิภาพนี้โดยอัตโนมัติหากคลาสไม่เปลี่ยนรูป (โดเมนทั้งหมดเป็นการปรับเปลี่ยนขั้นสุดท้ายและโดเมนทั้งหมดเป็นประเภทพื้นฐานหรือเป็นคลาสที่ไม่เปลี่ยนรูป) และค่าใช้จ่ายของการคำนวณรหัสแฮชก็ค่อนข้างสูงคุณควรพิจารณาแคชรหัสแฮชภายในวัตถุ
คลาสสาธารณะ HashCodeDemo {คลาสคงที่ HashCodeclass {Boolean Final Boolean สุดท้าย; Byte Byte Final Final Byte; Charvalue ตัวสุดท้ายส่วนตัว; สั้น ๆ สั้น ๆ สั้น ๆ สั้น ๆ ; intvalue int สุดท้ายส่วนตัว; Long Value Long Value ส่วนตัว Floatvalue Final Final Float; ส่วนตัวสองครั้งสุดท้ายสองครั้ง; สตริงสุดท้ายสุดท้าย INT สุดท้ายครั้งสุดท้ายครั้งสุดท้าย [] ArrayValue; // ความผันผวนหมายความว่าตัวแปรจะถูกจัดเก็บและดึงข้อมูลในหน่วยความจำทุกครั้งเพื่อให้แน่ใจว่าตัวแปรเป็น hashcode int ที่ผันผวนส่วนตัวล่าสุด Public HashCodeclass () {bresult = false; Bytevalue = 1; charvalue = 'a'; shortvalue = 1; intvalue = 1; LongValue = 1L; floatvalue = 1.0f; doublevalue = 1.0d; str = getClass (). getName (); arrayValue = ใหม่ int [] {1,2,3,4,5}; } @Override public int hashCode () {ถ้า (hashCode == 0) {// ตั้งค่าเริ่มต้นที่ไม่ใช่ศูนย์เพื่อเพิ่มความขัดแย้งของ Zero Domain Int ผลลัพธ์ = 17; // ถ้าตัวคูณถูกละไว้แล้วสตริงทั้งหมดที่มีลำดับตัวอักษรที่แตกต่างกันจะมีรหัสแฮชเดียวกันสุดท้าย int hash_code = 31; result = hash_code * ผลลัพธ์ + (bresult? 1: 0); result = hash_code * ผลลัพธ์ + bytevalue; result = hash_code * ผลลัพธ์ + charvalue; result = hash_code * ผลลัพธ์ + shortvalue; result = hash_code * ผลลัพธ์ + intvalue; result = hash_code * ผลลัพธ์ + (int) (longValue ^ (longValue >>> 32)); result = hash_code * ผลลัพธ์ + float.floattointbits (floatvalue); long doublelongvalue = double.doubletolongbits (doublevalue); result = hash_code * ผลลัพธ์ + (int) (doublelongvalue ^ (doublelongValue >>> 32)); result = hash_code * ผลลัพธ์ + (str == null? 0: str.hashCode ()); System.out.println ("str =" + str + ", str.hashcode =" + str.hashcode ()); result = hash_code * ผลลัพธ์ + arrayValue.hashCode (); ผลการกลับมา; } return hashcode; }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {hashcodeclass obj = new hashcodeclass (); System.out.println ("obj.hashCode =" + obj.hashCode ()); System.out.println ("obj ="+obj.toString ()); -เอาท์พุท
str = com.demo.test.hashcodeDemo $ hashcodeclass, str.hashcode = -205823051obj.hashcode = 946611167str = com.demo.test.hashcodeDemo $ hashcodeclass str.hashcode=-205823051obj=com.demo.test.hashcodedemo$hashcodeclass@386c23df
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ที่หารือเกี่ยวกับวิธีการประเมินที่ถูกต้องของ HashCode ใน Java และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!