जावा में हैशकोड का उपयोग क्या है?


161

जावा में, obj.hashCode()कुछ मूल्य देता है। प्रोग्रामिंग में इस हैश कोड का उपयोग क्या है?


यह प्रश्न कुछ और विवरण जोड़ता है। stackoverflow.com/questions/18078779/…
महेशवर्मा

1
इस पोस्ट पर अच्छा विवरण दिया गया है। eclipsesource.com/blogs/2012/09/04/...
विजय Vankhede

जवाबों:


222

hashCode()के लिए प्रयोग किया जाता है बकेटिंग में Hashचाहते कार्यान्वयन HashMap, HashTable, HashSet, आदि

से प्राप्त मूल्य hashCode()का उपयोग सेट / मैप के तत्वों के भंडारण के लिए बाल्टी नंबर के रूप में किया जाता है । यह बकेट नंबर सेट / मैप के अंदर के तत्व का पता है।

जब आप ऐसा करते हैं तो contains()यह तत्व का हैश कोड ले जाएगा, फिर उस बाल्टी को देखें जहां हैश कोड इंगित करता है। यदि एक ही बाल्टी में 1 से अधिक तत्व पाया जाता है (कई वस्तुओं में समान हैश कोड हो सकता है), तो यह equals()मूल्यांकन करने के लिए कि क्या वस्तुएं बराबर हैं, और फिर यह तय करें कि contains()क्या सच है या गलत है, या तय करें कि तत्व हो सकता है या नहीं। सेट में जोड़ा गया है या नहीं।


28
हाय बडी .. बहुत अच्छा जवाब लेकिन मुझे व्यावहारिक उदाहरण को समझने के लिए आसान के साथ एक बहुत ही दिलचस्प लिंक मिला: coderanch.com/t/321515/java/java/HashCode
Logicalj

शुक्रिया ऐशु। अब मुझे बाल्टी संबंधित स्पष्टीकरण के साथ हैशकोड के बारे में स्पष्ट जानकारी मिल गई है।
बालसुब्रमणि

2
"यदि एक ही बाल्टी में 1 से अधिक तत्व पाया जाता है .. तो इसका equals()मूल्यांकन करने के लिए उपयोग किया जाता है", तो क्या होगा यदि केवल एक हैश कोड मिलान किया गया तत्व पाया जाता है, यह सीधे सच है? लेकिन चूंकि कई वस्तुओं में समान हैश कोड हो सकता है, इसलिए यह equals()मूल्यांकन करने के लिए चलना होगा कि क्या मिलान तत्व समान है, अन्यथा यह आपको अप्रत्याशित परिणाम दे सकता है, क्या मैं सही हूं?
सारिकोइदो

एक तरफ बाल्टी, हैशकोड एक ऐसी विधि है जो ऑब्जेक्ट को प्रत्येक ऑब्जेक्ट को मेमोरी में स्टोर करने के आदेश को निर्धारित करने के लिए कहता है। यदि वस्तुएँ समान हैं, तो उनका हैशकोड भी बराबर होना चाहिए। (इस कथन का खंडन झूठा है)
NoName

1
किस मामले में एक प्रोग्रामर मैन्युअल रूप से hashCode()विधि लागू करेगा ?
कार्डिनल - मोनिका

33

से जावाडोक :

ऑब्जेक्ट के लिए कोई हैश कोड मान वापस आना। हैशटैब के लाभ के लिए इस पद्धति का समर्थन किया जाता है जैसे कि उनके द्वारा प्रदान किए गए java.util.Hashtable

का सामान्य अनुबंध hashCodeहै:

  • जब भी जावा एप्लिकेशन के निष्पादन के दौरान इसे एक से अधिक बार एक ही ऑब्जेक्ट पर लागू किया जाता है, तो hashCodeविधि को लगातार एक ही पूर्णांक को वापस करना होगा , बशर्ते वस्तु पर तुलना में उपयोग की गई कोई भी जानकारी संशोधित न हो। इस पूर्णांक को एक अनुप्रयोग के एक निष्पादन से एक ही अनुप्रयोग के दूसरे निष्पादन के अनुरूप नहीं रहना चाहिए।

  • यदि दो वस्तुएं equals(Object)विधि के अनुसार समान हैं , तो hashCodeदो वस्तुओं में से प्रत्येक पर विधि को कॉल करके एक ही पूर्णांक परिणाम का उत्पादन करना होगा।

  • यह आवश्यक नहीं है कि यदि दो वस्तुएं equals(java.lang.Object)विधि के अनुसार असमान हैं , तो hashCodeप्रत्येक दो वस्तुओं पर विधि को कॉल करने पर अलग-अलग पूर्णांक परिणाम उत्पन्न करने होंगे। हालांकि, प्रोग्रामर को यह पता होना चाहिए कि असमान वस्तुओं के लिए अलग पूर्णांक परिणाम बनाने से हैशटेबल्स के प्रदर्शन में सुधार हो सकता है।

जितना हो सके व्यावहारिक रूप से, क्लास ऑब्जेक्ट द्वारा परिभाषित हैशकोड विधि अलग-अलग वस्तुओं के लिए अलग-अलग पूर्णांक लौटाती है। (यह आमतौर पर ऑब्जेक्ट के आंतरिक पते को पूर्णांक में परिवर्तित करके कार्यान्वित किया जाता है , लेकिन यह कार्यान्वयन तकनीक जावा भाषा द्वारा आवश्यक नहीं है।)


14

द्वारा दिया गया मान hashCode()ऑब्जेक्ट का हैश कोड है, जो हेक्साडेसिमल में ऑब्जेक्ट का मेमोरी एड्रेस है।

परिभाषा के अनुसार, यदि दो वस्तुएँ समान हैं, तो उनका हैश कोड भी समान होना चाहिए। यदि आप equals()विधि को ओवरराइड करते हैं , तो आप उस तरीके को बदलते हैं जिसमें दो ऑब्जेक्ट समान होते हैं और ऑब्जेक्ट का कार्यान्वयन hashCode()अब मान्य नहीं है। इसलिए, यदि आप बराबर () विधि को ओवरराइड करते हैं, तो आपको विधि को भी ओवरराइड करना चाहिए hashCode()

यह उत्तर जावा एसई 8 आधिकारिक ट्यूटोरियल प्रलेखन से है


13

hashCode()एक ऐसा कार्य है जो एक वस्तु लेता है और एक संख्यात्मक मूल्य को आउटपुट करता है। ऑब्जेक्ट के लिए हैशकोड हमेशा समान होता है यदि ऑब्जेक्ट नहीं बदलता है।

कार्य की तरह है HashMap, HashTable, HashSet, आदि है कि दुकान वस्तुओं की जरूरत एक का उपयोग करेगा hashCodeअपने आंतरिक सरणी के आकार सापेक्ष क्या "स्मृति स्थिति" (यानी सरणी स्थिति) वस्तु स्टोर करने के लिए में चुनने के लिए।

कुछ मामले हैं जहां टकराव हो सकता है (दो ऑब्जेक्ट एक ही हैशकोड के साथ समाप्त होते हैं), और निश्चित रूप से, ध्यान से हल करने की आवश्यकता है।


6

हालाँकि हैशकोड आपके व्यावसायिक तर्क के साथ कुछ नहीं करता है, लेकिन हमें ज्यादातर मामलों में इसका ध्यान रखना होगा। क्योंकि जब आपकी वस्तु को हैश आधारित कंटेनर (हैशसेट, हैशपॉप ...) में रखा जाता है, तो कंटेनर तत्व का हैशकोड डालता है / प्राप्त करता है।


नहीं, यह नहीं है। यह कुंजी डालता है / जाता है। हैशकोड का उपयोग केवल बकेटिंग के लिए किया जाता है,
लोरेन

3

एक हैशकोड किसी भी वस्तु से उत्पन्न संख्या है।

यह वह है जो वस्तुओं को एक हैशटेबल में जल्दी से संग्रहीत / पुनर्प्राप्त करने की अनुमति देता है।

निम्नलिखित सरल उदाहरण की कल्पना करें :

आपके सामने टेबल पर। आपके पास नौ बक्से हैं, प्रत्येक को नंबर 1 से 9. के साथ चिह्नित किया गया है। आपके पास इन बॉक्सों में संग्रहीत करने के लिए बेतहाशा अलग-अलग वस्तुओं का ढेर भी है, लेकिन एक बार जब वे वहां होते हैं तो आपको उन्हें जल्दी से जल्दी खोजने में सक्षम होने की आवश्यकता होती है।

आपको जिस चीज की आवश्यकता होती है, वह तुरंत तय करने का एक तरीका है कि आपने किस बॉक्स में प्रत्येक वस्तु को रखा है। यह एक सूचकांक की तरह काम करता है। आप गोभी को खोजने का निर्णय लेते हैं ताकि आप देखें कि गोभी किस बॉक्स में है, फिर इसे प्राप्त करने के लिए सीधे उस बॉक्स पर जाएं।

अब कल्पना करें कि आप सूचकांक के साथ परेशान नहीं करना चाहते हैं, आप उस वस्तु से तुरंत पता लगाना चाहते हैं कि वह किस बॉक्स में रहती है।

उदाहरण में, आइए इसे करने के एक बहुत ही सरल तरीके का उपयोग करें - ऑब्जेक्ट के नाम पर अक्षरों की संख्या। तो गोभी बॉक्स 7 में चला जाता है, मटर बॉक्स 3 में जाता है, बॉक्स 6 में रॉकेट, बॉक्स 5 में बैंजो और इसी तरह।

गैंडे के बारे में क्या, हालांकि? इसमें 10 अक्षर हैं, इसलिए हम अपने एल्गोरिथ्म को थोड़ा बदल देंगे और "चारों ओर लपेटेंगे" ताकि 10-अक्षर ऑब्जेक्ट बॉक्स 1 में जाएं, बॉक्स 2 में 11 अक्षर और इसी तरह। वह किसी वस्तु को ढँक दे।

कभी-कभी एक बॉक्स में एक से अधिक ऑब्जेक्ट होगा, लेकिन यदि आप एक रॉकेट की तलाश कर रहे हैं, तो यह अभी भी मूंगफली और रॉकेट की तुलना करने के लिए बहुत तेज है, कैबेज, मटर, बैंजो और गैंडा के पूरे ढेर की जांच करने के लिए।

यह एक हैश कोड है। किसी वस्तु से एक संख्या प्राप्त करने का एक तरीका ताकि इसे हैशटेबल में संग्रहीत किया जा सके। जावा में, एक हैश कोड कोई भी पूर्णांक हो सकता है, और प्रत्येक ऑब्जेक्ट प्रकार स्वयं उत्पन्न करने के लिए जिम्मेदार है। ऑब्जेक्ट का "हैशकोड" विधि देखें।

सोर्स - यहाँ


-1

हैशकोड () के उपयोग में से एक कैचिंग तंत्र का निर्माण कर रहा है । इस उदाहरण को देखें:

        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));
}

'कैचिंग मैकेनिज्म' का क्या मतलब है? और यह कोड इसे कैसे दर्शाता है?
लोर्ने

-1

hashCode()एक अद्वितीय कोड है जो जेवीएम द्वारा प्रत्येक वस्तु निर्माण के लिए बनाया गया है।

हम hashCode()हैशटेबल, हैशमैप आदि जैसे हैशिंग संबंधित एल्गोरिथ्म पर कुछ ऑपरेशन करने के लिए उपयोग करते हैं।

hashCode()खोज ऑपरेशन को आसान बनाने के फायदे क्योंकि जब हम एक ऐसी वस्तु की खोज करते हैं जिसमें अद्वितीय कोड होता है, तो यह उस वस्तु का पता लगाने में मदद करता है।

लेकिन हम नहीं कह सकते कि hashCode()एक वस्तु का पता है। यह हर वस्तु के लिए जेवीएम द्वारा निर्मित एक अद्वितीय कोड है।

यही कारण है कि आजकल हैशिंग एल्गोरिथ्म सबसे लोकप्रिय खोज एल्गोरिथ्म है।


4
हैशकोड अद्वितीय नहीं है। 2 असमान वस्तुएं समान हैशकोड वापस कर सकती हैं।
Ranielle Canlas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.