सर्वप्रथम, आपण 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() ऑपरेशनचा निकाल चुकीचा असेल.
कन्सोलमधील दोन 10-अंकी संख्या हॅशकोड आहेत. जर आपल्याला समान वस्तू हवी असतील तर त्यांची नावे समान असतील तर? आपण काय केले पाहिजे? उत्तर: आपण आपल्या कॅरेक्टर क्लाससाठी ऑब्जेक्ट क्लासच्या हॅशकोड() आणि equals() पद्धती ओव्हरराइड केल्या पाहिजेत . आम्ही ते IDEA IDE मध्ये आपोआप करू शकतो, तुमच्या कीबोर्डवर फक्त alt + insert दाबा आणि Generate -> equals() आणि hashCode() निवडा . आमच्या उदाहरणाच्या बाबतीत आम्हाला पुढील कोड मिळाला आहे:
तर आता प्रोग्राम आपल्या ऑब्जेक्ट्सना समान म्हणून ओळखतो आणि त्यांच्याकडे समान हॅशकोड आहेत.
Java हॅशकोड उदाहरण:
तुमचा स्वतःचा हॅशकोड() आणि समान()
तुम्ही तुमची स्वतःची समान() आणि हॅशकोड() प्राप्ती देखील तयार करू शकता, परंतु सावधगिरी बाळगा आणि हॅशकोड टक्कर कमी करणे लक्षात ठेवा. विद्यार्थी वर्गातील आमच्या स्वतःच्या हॅशकोड() आणि equals() पद्धतींचे येथे उदाहरण आहे :
importjava.util.Date;publicclassStudent{String surname;String name;String secondName;Long birthday;// Long instead of long is used by Gson/Jackson json parsers and various orm databasespublicStudent(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@OverridepublicinthashCode(){//TODO: check for nulls//return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());return(surname + name + secondName + birthday).hashCode();}@Overridepublicbooleanequals(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));}}
आणि मुख्य वर्ग त्यांचे कार्य प्रदर्शित करण्यासाठी:
importjava.util.Date;importjava.util.HashMap;importjava.util.Hashtable;publicclassMain{staticHashMap<Student,Integer> cache =newHashMap<Student,Integer>();// <person, targetPriority>publicstaticvoidmain(String[] args){Student sarah1 =newStudent("Sarah","Connor","Jane",null);Student sarah2 =newStudent("Sarah","Connor","Jane",newDate(1970,01-1,01));Student sarah3 =newStudent("Sarah","Connor","Jane",newDate(1959,02-1,28));// date not existsStudent john =newStudent("John","Connor","Kyle",newDate(1985,02-1,28));// date not existsStudent johnny =newStudent("John","Connor","Kyle",newDate(1985,02-1,28));// date not existsSystem.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(newDate(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 मध्ये हॅशिंग तत्त्व काही लोकप्रिय संग्रहांच्या मागे आहे, जसे की हॅशमॅप , हॅशसेट आणि हॅशटेबल .
निष्कर्ष
प्रत्येक जावा ऑब्जेक्टमध्ये हॅशकोड() आणि इक्वल्स() पद्धती ऑब्जेक्ट क्लासमधून वारशाने प्राप्त होतात. चांगली कार्य समानता यंत्रणा मिळविण्यासाठी, तुम्ही तुमच्या स्वतःच्या वर्गांसाठी हॅशकोड() आणि समान() पद्धती अधिक चांगल्या प्रकारे ओव्हरराइड कराल. हॅशकोड वापरल्याने प्रोग्राम जलद चालतात.
0
टिप्पण्या
लोकप्रिय
नवीन
जुने
टिप्पणी करण्यासाठी तुम्ही साईन इन केलेले असणे आवश्यक आहे