हैश सिद्धांत
सबसे पहले, जावा हैशकोड को परिभाषित करने से पहले, हमें यह समझने की आवश्यकता है कि हैशिंग क्या है और इसके लिए क्या है। हैशिंग कुछ डेटा पर हैश फ़ंक्शन लगाने की एक प्रक्रिया है। एक हैश फ़ंक्शन सिर्फ एक गणितीय कार्य है। इसके बारे में चिंता मत करो! "गणितीय" का अर्थ हमेशा "जटिल" नहीं होता है। यहाँ इसका मतलब केवल इतना है कि हमारे पास कुछ डेटा और एक निश्चित नियम है जो डेटा को वर्णों (कोड) के एक सेट में मैप करता है। उदाहरण के लिए, यह एक हेक्साडेसिमल सिफर हो सकता है। हमारे पास इनपुट पर किसी भी आकार का कुछ डेटा है, और इसमें हैश फ़ंक्शन लागू करें। आउटपुट पर, हमें एक निश्चित आकार का डेटा मिलता है, कहते हैं, 32 अक्षर। आम तौर पर, इस प्रकार का फ़ंक्शन डेटा के एक बड़े टुकड़े को एक छोटे पूर्णांक मान में परिवर्तित करता है। इस फ़ंक्शन कार्य के परिणाम को हैश कोड कहा जाता है। क्रिप्टोग्राफी और कुछ अन्य क्षेत्रों में भी हैश फ़ंक्शंस का व्यापक रूप से उपयोग किया जाता है। हैश फ़ंक्शन भिन्न हो सकते हैं,
- किसी विशेष वस्तु का एक विशेष हैशकोड होता है।
- यदि दो वस्तुएँ समान हैं, तो उनके हैशकोड समान हैं। उलटा सच नहीं है।
- यदि हैश कोड अलग हैं, तो निश्चित रूप से वस्तुएं समान नहीं हैं।
- अलग-अलग वस्तुओं में एक ही हैश कोड हो सकता है। हालाँकि, यह एक बहुत ही असंभावित घटना है। इस बिंदु पर, हमारे पास टक्कर है, ऐसी स्थिति है, जहां हम डेटा खो सकते हैं।
"उचित" हैश फ़ंक्शन टकराव की संभावना को कम करता है।
जावा में हैशकोड
जावा में हैश फ़ंक्शन आमतौर पर
हैशकोड () विधि से जुड़ा होता है । सटीक रूप से, हैश फ़ंक्शन को किसी ऑब्जेक्ट पर लागू करने का परिणाम हैशकोड है। प्रत्येक जावा ऑब्जेक्ट में हैश कोड होता है। सामान्य तौर पर हैश कोड वर्ग की
हैशकोड () विधि द्वारा गणना की जाने वाली संख्या है । आम तौर पर, प्रोग्रामर विशिष्ट डेटा के अधिक कुशल प्रसंस्करण के लिए
Object
इस विधि को अपनी वस्तुओं के साथ-साथ
हैशकोड () बराबर
() विधि से संबंधित ओवरराइड करते हैं। हैशकोड
() विधि एक इंट (4 बाइट्स) मान लौटाती है, जो वस्तु का एक संख्यात्मक प्रतिनिधित्व है। इस हैशकोड का उपयोग, उदाहरण के लिए, डेटा के अधिक कुशल भंडारण के लिए संग्रह द्वारा किया जाता है और तदनुसार, उन तक तेजी से पहुंच होती है। डिफ़ॉल्ट रूप से,
हैशकोड ()किसी ऑब्जेक्ट के लिए फ़ंक्शन मेमोरी सेल की संख्या लौटाता है जहां ऑब्जेक्ट संग्रहीत होता है। इसलिए, यदि एप्लिकेशन कोड में कोई परिवर्तन नहीं किया जाता है, तो फ़ंक्शन को समान मान वापस करना चाहिए। यदि कोड थोड़ा बदलता है, तो हैशकोड मान भी बदल जाता है। जावा में उपयोग किया जाने वाला हैशकोड क्या है? सबसे पहले जावा हैशकोड प्रोग्राम को तेजी से चलाने में मदद करता है। उदाहरण के लिए, यदि हम दो वस्तुओं
o1
और
o2
किसी प्रकार की तुलना करते हैं, तो ऑपरेशन
o1.equals(o2)
की तुलना में लगभग 20 गुना अधिक समय लगता है
o1.hashCode() == o2.hashCode()
।
जावा बराबर ()
मूल वर्ग में ,
हैशकोड ()Object
विधि के साथ ,
बराबर () फ़ंक्शन भी है , जिसका उपयोग दो वस्तुओं की समानता की जांच करने के लिए किया जाता है। इस फ़ंक्शन का डिफ़ॉल्ट कार्यान्वयन केवल दो वस्तुओं के लिंक को उनकी समानता के लिए जांचता है।
बराबर() और
हैशकोड() का अनुबंध है, इसलिए यदि आप उनमें से एक को ओवरराइड करते हैं, तो आपको इस अनुबंध को तोड़ने के क्रम में दूसरे को ओवरराइड करना चाहिए।
हैशकोड () विधि को लागू करना
उदाहरण
चलिए एक वर्ग बनाते हैं
चरित्र एक क्षेत्र के साथ -
नाम ।
उसके बाद, हम कैरेक्टर क्लास,
कैरेक्टर 1 और
कैरेक्टर 2 के दो ऑब्जेक्ट बनाते हैं और उन्हें उसी नाम से सेट करते हैं।
यदि हम ऑब्जेक्ट क्लास के डिफ़ॉल्ट
हैशकोड () और
बराबर () का उपयोग करते हैं, तो हम निश्चित रूप से अलग-अलग ऑब्जेक्ट प्राप्त करेंगे, समान ऑब्जेक्ट नहीं। जावा में हैशकोड कैसे काम करता है। उनके पास अलग-अलग हैशकोड होंगे क्योंकि वे अलग-अलग मेमोरी सेल में हैं और
बराबर () ऑपरेशन का परिणाम गलत होगा।
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-अंकीय संख्या हैशकोड हैं। यदि हम समान नाम रखते हैं तो क्या होगा यदि हम समान वस्तुएँ चाहते हैं? काय करते? उत्तर: हमें अपने
कैरेक्टर क्लास के लिए
ऑब्जेक्ट क्लास के हैशकोड () और
बराबर () तरीकों को ओवरराइड करना चाहिए। हम इसे आईडीईए आईडीई में स्वचालित रूप से कर सकते हैं, बस अपने कीबोर्ड पर
alt + डालें दबाएं और 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
तो अब प्रोग्राम हमारी वस्तुओं को समान पहचानता है और उनके पास समान हैशकोड हैं।
जावा हैशकोड उदाहरण:
आपका अपना हैशकोड () और बराबर ()
आप अपने स्वयं के
समान () और
हैशकोड () अहसास भी बना सकते हैं, लेकिन सावधान रहें और हैशकोड टकराव को कम करना याद रखें।
यहाँ छात्र वर्ग में हमारे अपने
हैशकोड () और
बराबर () विधियों का एक उदाहरण दिया गया है:
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 गुना अधिक समय लगता है। जावा हैशिंग सिद्धांत में कुछ लोकप्रिय संग्रह हैं, जैसे
हैश मैप ,
हैशसेट और
हैशटेबल ।
निष्कर्ष
प्रत्येक जावा ऑब्जेक्ट में
हैशकोड () और
बराबर () विधियाँ
ऑब्जेक्ट क्लास से विरासत में मिली हैं। एक अच्छा कामकाजी समानता तंत्र प्राप्त करने के लिए, आप अपनी कक्षाओं के लिए
हैशकोड() और
बराबर() विधियों को बेहतर ढंग से ओवरराइड करेंगे। हैशकोड का उपयोग करने से प्रोग्राम तेजी से चलते हैं।
GO TO FULL VERSION