सर्वप्रथम, आपण Java हॅशकोड परिभाषित करण्यापूर्वी, आपल्याला हॅशिंग म्हणजे काय आणि ते कशासाठी आहे हे समजून घेणे आवश्यक आहे. हॅशिंग ही काही डेटावर हॅश फंक्शन लागू करण्याची प्रक्रिया आहे. हॅश फंक्शन हे फक्त एक गणितीय कार्य आहे. याची काळजी करू नका! "गणितीय" चा अर्थ नेहमीच "गुंतागुंतीचा" होत नाही. येथे याचा अर्थ असा आहे की आमच्याकडे काही डेटा आणि एक विशिष्ट नियम आहे जो डेटाला अक्षरांच्या संचामध्ये (कोड) मॅप करतो. उदाहरणार्थ, हे हेक्साडेसिमल सायफर असू शकते. आमच्याकडे इनपुटवर कोणत्याही आकाराचा काही डेटा असतो आणि त्यावर हॅश फंक्शन लागू करतो. आउटपुटवर, आम्हाला 32 वर्णांचा एक निश्चित आकाराचा डेटा मिळतो. सहसा, अशा प्रकारचे फंक्शन डेटाच्या मोठ्या तुकड्याला लहान पूर्णांक मूल्यामध्ये रूपांतरित करते. या कार्याच्या परिणामास हॅश कोड म्हणतात. हॅश फंक्शन्स क्रिप्टोग्राफी आणि इतर काही क्षेत्रांमध्ये मोठ्या प्रमाणावर वापरले जातात. हॅश फंक्शन्स भिन्न असू शकतात,
विशिष्ट ऑब्जेक्टमध्ये विशिष्ट हॅशकोड असतो.
दोन वस्तू समान असल्यास, त्यांचे हॅशकोड समान असतात. उलट सत्य नाही.
जर हॅश कोड भिन्न असतील तर ऑब्जेक्ट्स निश्चितपणे समान नाहीत.
वेगवेगळ्या ऑब्जेक्ट्समध्ये समान हॅश कोड असू शकतो. तथापि, ही एक अत्यंत संभाव्य घटना आहे. या टप्प्यावर, आमच्याकडे टक्कर आहे, अशी परिस्थिती आहे जिथे आम्ही डेटा गमावू शकतो.
"योग्य" हॅश फंक्शन टक्कर होण्याची शक्यता कमी करते.
Java मध्ये हॅशकोड
Java मध्ये हॅश फंक्शन सहसा हॅशकोड() पद्धतीशी जोडलेले असते . तंतोतंत, ऑब्जेक्टवर हॅश फंक्शन लागू करण्याचा परिणाम म्हणजे हॅशकोड. प्रत्येक Java ऑब्जेक्टमध्ये हॅश कोड असतो. सर्वसाधारणपणे हॅश कोड हा वर्गाच्या हॅशकोड()Object पद्धतीद्वारे मोजला जाणारा क्रमांक आहे . सहसा, प्रोग्रामर त्यांच्या ऑब्जेक्ट्ससाठी तसेच विशिष्ट डेटाच्या अधिक कार्यक्षम प्रक्रियेसाठी hashCode() the equals() पद्धतीशी संबंधित ही पद्धत अधिलिखित करतात. हॅशकोड () पद्धत इंट (4 बाइट) मूल्य देते, जे ऑब्जेक्टचे संख्यात्मक प्रतिनिधित्व आहे. हा हॅशकोड वापरला जातो, उदाहरणार्थ, डेटाच्या अधिक कार्यक्षम संचयनासाठी संग्रहाद्वारे आणि त्यानुसार, त्यांच्यापर्यंत जलद प्रवेश. डीफॉल्टनुसार, हॅशकोड()ऑब्जेक्टसाठी फंक्शन मेमरी सेलची संख्या देते जेथे ऑब्जेक्ट संग्रहित केला जातो. म्हणून, ऍप्लिकेशन कोडमध्ये कोणतेही बदल न केल्यास, फंक्शनने समान मूल्य परत केले पाहिजे. कोड किंचित बदलल्यास, हॅशकोड मूल्य देखील बदलते. Java मध्ये हॅशकोड कशासाठी वापरला जातो? सर्व प्रथम Java हॅशकोड प्रोग्राम जलद चालवण्यास मदत करतात. उदाहरणार्थ, जर आपण दोन वस्तूंची o1आणि o2काही प्रकारची तुलना केली तर, ऑपरेशनला o1.equals(o2)पेक्षा सुमारे 20 पट जास्त वेळ लागतो o1.hashCode() == o2.hashCode().
Java बरोबरी ()
पॅरेंट क्लासमध्ये , हॅशकोड()Object पद्धतीसह , समान() हे फंक्शन देखील आहे जे दोन ऑब्जेक्ट्सची समानता तपासण्यासाठी वापरले जाते. या फंक्शनची डीफॉल्ट अंमलबजावणी दोन ऑब्जेक्ट्सच्या लिंक्स त्यांच्या समतुल्यतेसाठी तपासते. equals() आणि hashCode() यांचा करार आहे, त्यामुळे जर तुम्ही त्यापैकी एक ओव्हरराइड केला, तर हा करार मोडू नये म्हणून तुम्ही दुसरा ओव्हरराइड केला पाहिजे.
हॅशकोड() पद्धतीची अंमलबजावणी करणे
उदाहरण
चला एका फील्डसह एक वर्ग वर्ण तयार करूया — नाव . त्यानंतर, आपण कॅरेक्टर क्लास, character1 आणि character2 च्या दोन ऑब्जेक्ट्स तयार करतो आणि त्यांना समान नाव सेट करतो. ऑब्जेक्ट क्लासचे डिफॉल्ट हॅशकोड() आणि equals() वापरल्यास , आम्हाला निश्चितपणे भिन्न मिळतील, समान ऑब्जेक्ट्स नाहीत. अशा प्रकारे Java मध्ये हॅशकोड कार्य करते. त्यांच्याकडे वेगवेगळे हॅशकोड असतील कारण ते वेगवेगळ्या मेमरी सेलमध्ये आहेत आणि equals() ऑपरेशनचा निकाल चुकीचा असेल.
import java.util.Objects;
public class Character {
private String Name;
public Character(String name) {
Name = name;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public static void main(String[] args) {
Character character1 = new Character("Arnold");
System.out.println(character1.getName());
System.out.println(character1.hashCode());
Character character2 = new Character("Arnold");
System.out.println(character2.getName());
System.out.println(character2.hashCode());
System.out.println(character2.equals(character1));
}
}
प्रोग्राम चालवण्याचे परिणाम:
Arnold
1595428806
Arnold
1072408673
false
कन्सोलमधील दोन 10-अंकी संख्या हॅशकोड आहेत. जर आपल्याला समान वस्तू हवी असतील तर त्यांची नावे समान असतील तर? आपण काय केले पाहिजे? उत्तर: आपण आपल्या कॅरेक्टर क्लाससाठी ऑब्जेक्ट क्लासच्या हॅशकोड() आणि equals() पद्धती ओव्हरराइड केल्या पाहिजेत . आम्ही ते IDEA IDE मध्ये आपोआप करू शकतो, तुमच्या कीबोर्डवर फक्त alt + insert दाबा आणि Generate -> equals() आणि hashCode() निवडा . आमच्या उदाहरणाच्या बाबतीत आम्हाला पुढील कोड मिळाला आहे:
import java.util.Objects;
public class Character {
private String Name;
public Character(String name) {
Name = name;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Character)) return false;
Character character = (Character) o;
return getName() != null ? getName().equals(character.getName()) : character.getName() == null;
}
@Override
public int hashCode() {
return getName() != null ? getName().hashCode() : 0;
}
public static void main(String[] args) {
Character character1 = new Character("Arnold");
System.out.println(character1.getName());
System.out.println(character1.hashCode());
Character character2 = new Character("Arnold");
System.out.println(character2.getName());
System.out.println(character2.hashCode());
System.out.println(character2.equals(character1));
}
}
हा कोड चालवण्याचा परिणाम:
Arnold
1969563338
Arnold
1969563338
true
तर आता प्रोग्राम आपल्या ऑब्जेक्ट्सना समान म्हणून ओळखतो आणि त्यांच्याकडे समान हॅशकोड आहेत.
Java हॅशकोड उदाहरण:
तुमचा स्वतःचा हॅशकोड() आणि समान()
तुम्ही तुमची स्वतःची समान() आणि हॅशकोड() प्राप्ती देखील तयार करू शकता, परंतु सावधगिरी बाळगा आणि हॅशकोड टक्कर कमी करणे लक्षात ठेवा. विद्यार्थी वर्गातील आमच्या स्वतःच्या हॅशकोड() आणि equals() पद्धतींचे येथे उदाहरण आहे :
import java.util.Date;
public class Student {
String surname;
String name;
String secondName;
Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
//Java hashcode example
@Override
public int hashCode(){
//TODO: check for nulls
//return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
return (surname + name + secondName + birthday).hashCode();
}
@Override
public boolean equals(Object other_) {
Student other = (Student)other_;
return (surname == null || surname.equals(other.surname) )
&& (name == null || name.equals(other.name))
&& (secondName == null || secondName.equals(other.secondName))
&& (birthday == null || birthday.equals(other.birthday));
}
}
आणि मुख्य वर्ग त्यांचे कार्य प्रदर्शित करण्यासाठी:
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
public class Main {
static HashMap<Student, Integer> cache = new HashMap<Student, Integer>(); // <person, targetPriority>
public static void main(String[] args) {
Student sarah1 = new Student("Sarah","Connor", "Jane", null);
Student sarah2 = new Student("Sarah","Connor", "Jane", new Date(1970, 01-1, 01));
Student sarah3 = new Student("Sarah","Connor", "Jane", new Date(1959, 02-1, 28)); // date not exists
Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
Student johnny = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
System.out.println(john.hashCode());
System.out.println(johnny.hashCode());
System.out.println(sarah1.hashCode());
System.out.println();
cache.put(sarah1, 1);
cache.put(sarah2, 2);
cache.put(sarah3, 3);
System.out.println(new Date(sarah1.birthday));
System.out.println();
cache.put(john, 5);
System.out.println(cache.get(john));
System.out.println(cache.get(johnny));
cache.put(johnny, 7);
System.out.println(cache.get(john));
System.out.println(cache.get(johnny));
}
}
हॅशकोड कशासाठी वापरला जातो?
सर्व प्रथम हॅशकोड प्रोग्राम जलद चालण्यास मदत करतात. उदाहरणार्थ, जर आपण दोन वस्तूंची o1आणि o2काही प्रकारची तुलना केली, तर ऑपरेशनला o1.equals(o2)o1.hashCode() == o2.hashCode() पेक्षा सुमारे 20 पट जास्त वेळ लागतो. Java मध्ये हॅशिंग तत्त्व काही लोकप्रिय संग्रहांच्या मागे आहे, जसे की हॅशमॅप , हॅशसेट आणि हॅशटेबल .
निष्कर्ष
प्रत्येक जावा ऑब्जेक्टमध्ये हॅशकोड() आणि इक्वल्स() पद्धती ऑब्जेक्ट क्लासमधून वारशाने प्राप्त होतात. चांगली कार्य समानता यंत्रणा मिळविण्यासाठी, तुम्ही तुमच्या स्वतःच्या वर्गांसाठी हॅशकोड() आणि समान() पद्धती अधिक चांगल्या प्रकारे ओव्हरराइड कराल. हॅशकोड वापरल्याने प्रोग्राम जलद चालतात.
GO TO FULL VERSION