ใน Java ให้obj.hashCode()
คืนค่าบางค่า การใช้รหัสแฮชนี้ในการเขียนโปรแกรมคืออะไร?
ใน Java ให้obj.hashCode()
คืนค่าบางค่า การใช้รหัสแฮชนี้ในการเขียนโปรแกรมคืออะไร?
คำตอบ:
hashCode()
จะใช้สำหรับการbucketingในHash
การใช้งานที่ชอบHashMap
, HashTable
, HashSet
ฯลฯ
ค่าที่ได้รับจากhashCode()
จะถูกใช้เป็นหมายเลขถังสำหรับจัดเก็บองค์ประกอบของชุด / แผนที่ หมายเลขถังนี้คือที่อยู่ขององค์ประกอบภายในชุด / แผนที่
เมื่อคุณทำcontains()
มันจะใช้รหัสแฮชขององค์ประกอบจากนั้นมองหาที่ฝากข้อมูลที่รหัสแฮชชี้ไปที่ หากพบมากกว่า 1 องค์ประกอบในที่เก็บข้อมูลเดียวกัน (หลายวัตถุสามารถมีรหัสแฮชเดียวกันได้) จากนั้นจะใช้equals()
วิธีการประเมินว่าวัตถุเท่ากันแล้วตัดสินใจว่าcontains()
เป็นจริงหรือเท็จหรือตัดสินว่าองค์ประกอบอาจเป็น เพิ่มในชุดหรือไม่
equals()
ประเมินผล" ดังนั้นจะเกิดอะไรขึ้นหากพบรหัสองค์ประกอบแฮชที่ตรงกับองค์ประกอบเดียวเท่านั้นจะส่งคืนจริงหรือไม่ แต่เนื่องจากวัตถุหลาย ๆ ชิ้นสามารถมีรหัสแฮชเดียวกันดังนั้นจึงจำเป็นต้องเรียกใช้equals()
เพื่อประเมินว่าองค์ประกอบที่ตรงกันเท่ากันมิฉะนั้นอาจทำให้คุณได้ผลลัพธ์ที่ไม่คาดคิดใช่ไหม
hashCode()
เมธอดด้วยตนเองในกรณีใด
จากJavadoc :
ส่งคืนค่ารหัสแฮชสำหรับวัตถุ วิธีนี้ได้รับการสนับสนุนเพื่อประโยชน์ของ hashtables
java.util.Hashtable
เช่นผู้ให้บริการโดยสัญญาทั่วไป
hashCode
คือ:
เมื่อใดก็ตามที่มีการเรียกใช้บนวัตถุเดียวกันมากกว่าหนึ่งครั้งในระหว่างการดำเนินการของแอปพลิเคชัน Java
hashCode
วิธีการจะต้องส่งกลับจำนวนเต็มเดียวกันอย่างสม่ำเสมอโดยไม่มีข้อมูลที่ใช้ในการเปรียบเทียบเท่ากับการแก้ไขวัตถุ จำนวนเต็มนี้ไม่จำเป็นต้องคงที่จากการเรียกใช้แอปพลิเคชันหนึ่งไปยังการเรียกใช้แอปพลิเคชันเดียวกันอีกครั้งหากวัตถุสองชิ้นมีค่าเท่ากันตาม
equals(Object)
วิธีการการเรียกใช้hashCode
วิธีการกับวัตถุทั้งสองนั้นจะต้องให้ผลลัพธ์ที่เป็นจำนวนเต็มเหมือนกันมันเป็นเรื่องที่ไม่จำเป็นว่าถ้าวัตถุสองไม่เท่ากันตาม
equals(java.lang.Object)
วิธีการแล้วเรียกhashCode
วิธีการในแต่ละวัตถุทั้งสองจะต้องก่อให้เกิดผลที่แตกต่างกันจำนวนเต็ม อย่างไรก็ตามโปรแกรมเมอร์ควรตระหนักว่าการสร้างผลลัพธ์จำนวนเต็มที่แตกต่างกันสำหรับวัตถุที่ไม่เท่ากันอาจปรับปรุงประสิทธิภาพของแฮชเทเบิลได้เท่าที่เป็นจริงในทางปฏิบัติวิธีการ hashCode ที่กำหนดโดยวัตถุคลาสจะส่งกลับจำนวนเต็มที่แตกต่างกันสำหรับวัตถุที่แตกต่างกัน (โดยทั่วไปแล้วจะนำไปใช้โดยการแปลงที่อยู่ภายในของวัตถุให้เป็นจำนวนเต็มแต่ไม่จำเป็นต้องใช้เทคนิคการติดตั้งนี้ในภาษาการเขียนโปรแกรม Java)
ค่าที่ส่งคืนโดย
hashCode()
คือรหัสแฮชของวัตถุซึ่งเป็นที่อยู่หน่วยความจำของวัตถุเป็นเลขฐานสิบหกตามคำจำกัดความหากวัตถุสองชิ้นมีค่าเท่ากันรหัสแฮชจะต้องเท่ากัน หากคุณแทนที่
equals()
วิธีนี้คุณจะเปลี่ยนวิธีการจัดวางวัตถุสองรายการและการใช้งานวัตถุhashCode()
ไม่ถูกต้องอีกต่อไป ดังนั้นหากคุณแทนที่เมธอด equals () คุณจะต้องแทนที่hashCode()
เมธอดด้วยเช่นกัน
hashCode()
เป็นฟังก์ชั่นที่รับวัตถุและส่งออกค่าตัวเลข hashcode สำหรับวัตถุจะเหมือนกันเสมอหากวัตถุนั้นไม่เปลี่ยนแปลง
การทำงานเช่นHashMap
, HashTable
, HashSet
ฯลฯ ที่จำเป็นต้องเก็บวัตถุที่จะใช้hashCode
แบบโมดูโลขนาดของอาร์เรย์ภายในของพวกเขาที่จะเลือกในสิ่งที่ตำแหน่ง "ความทรงจำ" (คือตำแหน่งอาร์เรย์) ในการจัดเก็บวัตถุ
มีบางกรณีที่อาจเกิดการชน (วัตถุสองชิ้นลงท้ายด้วยแฮชโค้ดเดียวกัน) และแน่นอนว่าต้องแก้ไขอย่างระมัดระวัง
แม้ว่า hashcode จะไม่ทำอะไรกับตรรกะทางธุรกิจของคุณ แต่เราต้องดูแลในกรณีส่วนใหญ่ เนื่องจากเมื่อวัตถุของคุณใส่ลงในคอนเทนเนอร์ที่ใช้แฮช (HashSet, HashMap ... ) คอนเทนเนอร์จะใส่ / รับแฮชโค้ดขององค์ประกอบ
แฮชโค้ดเป็นจำนวนที่สร้างจากวัตถุใด ๆ
นี่คือสิ่งที่ช่วยให้วัตถุสามารถจัดเก็บ / ดึงข้อมูลได้อย่างรวดเร็วใน Hashtable
ลองนึกภาพตัวอย่างง่ายๆต่อไปนี้:
บนโต๊ะข้างหน้าคุณ คุณมีเก้ากล่องแต่ละกล่องที่มีหมายเลข 1 ถึง 9 คุณมีกองวัตถุต่าง ๆ ที่เก็บไว้ในกล่องเหล่านี้ แต่เมื่อมีอยู่ในนั้นคุณจะต้องค้นหาให้เร็วที่สุด
สิ่งที่คุณต้องการคือวิธีการตัดสินใจได้ทันทีว่าคุณใส่กล่องอะไรลงไปมันทำงานเหมือนดัชนี คุณตัดสินใจที่จะหากะหล่ำปลีดังนั้นคุณจึงค้นหากล่องกะหล่ำปลีที่อยู่ในนั้นแล้วตรงไปที่กล่องเพื่อรับมัน
ทีนี้ลองนึกภาพว่าคุณไม่ต้องการรบกวนดัชนีคุณต้องการค้นหาทันทีจากวัตถุที่อยู่ในกล่อง
ในตัวอย่างลองใช้วิธีง่ายๆในการทำสิ่งนี้ - จำนวนตัวอักษรในชื่อของวัตถุ ดังนั้นกะหล่ำปลีจะไปในกล่องที่ 7 ถั่วจะไปในกล่องที่ 3 จรวดในกล่องที่ 6 ที่แบนโจในกล่องที่ 5 และอื่น ๆ
แล้วแรดล่ะ? มันมี 10 ตัวอักษรดังนั้นเราจะเปลี่ยนอัลกอริทึมของเราเล็กน้อยและ "ล้อมรอบ" เพื่อให้วัตถุ 10 ตัวอักษรไปในกล่องที่ 1, 11 ตัวอักษรในกล่องที่ 2 เป็นต้น ที่ควรครอบคลุมวัตถุใด ๆ
บางครั้งกล่องจะมีวัตถุมากกว่าหนึ่งวัตถุ แต่ถ้าคุณกำลังมองหาจรวดมันยังเร็วกว่าการเปรียบเทียบถั่วลิสงกับจรวดมากกว่าการตรวจสอบกองทั้งหมดของกะหล่ำปลีถั่วลันเตาและแรด
นั่นคือรหัสแฮช วิธีรับหมายเลขจากวัตถุเพื่อให้สามารถเก็บไว้ใน Hashtable ใน Java รหัสแฮชสามารถเป็นจำนวนเต็มใด ๆ และวัตถุแต่ละชนิดมีหน้าที่สร้างของตัวเอง ค้นหาวิธี "hashCode" ของ Object
ที่มา - ที่นี่
หนึ่งของการใช้งานของ hashCode () ที่จะสร้างกลไกการจับ ดูตัวอย่างนี้:
class Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (x != point.x) return false;
return y == point.y;
}
@Override
public int hashCode()
{
int result = x;
result = 31 * result + y;
return result;
}
class Line
{
public Point start, end;
public Line(Point start, Point end)
{
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Line line = (Line) o;
if (!start.equals(line.start)) return false;
return end.equals(line.end);
}
@Override
public int hashCode()
{
int result = start.hashCode();
result = 31 * result + end.hashCode();
return result;
}
}
class LineToPointAdapter implements Iterable<Point>
{
private static int count = 0;
private static Map<Integer, List<Point>> cache = new HashMap<>();
private int hash;
public LineToPointAdapter(Line line)
{
hash = line.hashCode();
if (cache.get(hash) != null) return; // we already have it
System.out.println(
String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
++count, line.start.x, line.start.y, line.end.x, line.end.y));
}
hashCode()
เป็นรหัสที่ไม่ซ้ำกันซึ่งสร้างโดย JVM สำหรับการสร้างวัตถุทุกครั้ง
เราใช้hashCode()
เพื่อดำเนินการบางอย่างเกี่ยวกับอัลกอริทึมที่เกี่ยวข้องกับการแฮชเช่น Hashtable, Hashmap ฯลฯ
ข้อดีของการhashCode()
ทำการค้นหาให้ง่ายเพราะเมื่อเราค้นหาวัตถุที่มีรหัสที่ไม่ซ้ำกันมันช่วยในการค้นหาวัตถุนั้น
แต่เราไม่สามารถพูดได้ว่าhashCode()
เป็นที่อยู่ของวัตถุ มันเป็นรหัสที่ไม่ซ้ำกันที่สร้างขึ้นโดย JVM สำหรับทุกวัตถุ
นั่นคือเหตุผลที่อัลกอริทึมการแฮชปัจจุบันเป็นวิธีค้นหาที่นิยมมาก