दिलचस्प पोस्ट
'एपली () के साथ' नया 'ऑपरेटर का प्रयोग करें। क्या यह संभव है? बटन क्लिक पर नई गतिविधि कैसे आरंभ करें बेस्ट जनरल एसवीएन अनदेखा पैटर्न? Xcode 6 और बाद में में "व्युत्पन्न डेटा हटाएं" कैसे करें? निर्भरता इंजेक्शन और सिंगलटन डिजाइन पैटर्न हॉवर पर बोल्ड होने पर इनलाइन तत्वों को बदलते हैं कोई WPF अनुप्रयोग से सांत्वना नहीं आउटपुट? PHP के साथ बेस यूआरएल कैसे प्राप्त करें? आप विकास कोड और उत्पादन कोड कैसे बनाए रखते हैं? कैसे खिड़कियों से कुकीज़ को हटाने के लिए? MongoDB रिकॉर्ड खोजें जहां सरणी फ़ील्ड रिक्त नहीं है एक SQLite "IN" खंड के लिए पैरामीटर प्रतिस्थापन एचटीएमएल टैग्स के रूप में एचटीएमएल टैग्स से बचने के लिए सबसे तेज़ तरीका? पॉलीमॉर्फिज़्म जीएसएन के साथ मैं वीबीए / प्रवेश को परिभाषित करने के लिए चर की आवश्यकता कैसे कर सकता हूं?

कैसे जावा में हिश कोड () की गणना की जाती है

क्या hashCode() विधि जावा में लौट रहा है?

मैंने पढ़ा है कि यह किसी ऑब्जेक्ट का एक मेमोरी संदर्भ है … जब मैं new Integer(1) लिए हैश मान को प्रिंट करता हूं, तो यह 1 है; String("a") 97 है

मैं उलझन में हूँ: क्या यह एएससीआईआई है या किस प्रकार का मान है?

वेब के समाधान से एकत्रित समाधान "कैसे जावा में हिश कोड () की गणना की जाती है"

एक हैशोड एक पूर्णांक मान है, जिस पर उस ऑब्जेक्ट की स्थिति को दर्शाता है जिस पर इसे बुलाया गया था। यही कारण है कि एक Integer जो 1 पर सेट है, "1" का हैशोड वापस करेगा क्योंकि एक Integer's हैशोड और उसका मान एक ही बात है। एक कैरेक्टर के हैशोड इसके एएससीआईआई वर्ण कोड के बराबर है। यदि आप एक कस्टम प्रकार लिखते हैं तो आप एक अच्छा hashCode कार्यान्वयन बनाने के लिए ज़िम्मेदार हैं जो वर्तमान उदाहरण की स्थिति का श्रेष्ठ प्रतिनिधित्व करेगा।

hashCode() द्वारा दिया जाने वाला मान ऑब्जेक्ट के मेमोरी एड्रेस के लिए गारंटीकृत नहीं है। मैं Object क्लास में कार्यान्वयन के बारे में निश्चित नहीं हूं, लेकिन ध्यान रखें कि अधिकांश कक्षाएं hashCode() को ओवरराइड कर देगी, ऐसे दो उदाहरण हैं जो अर्थ के बराबर हैं (लेकिन ऐसा नहीं है) एक ही मूल्य के लिए हैश होगा यह विशेष रूप से महत्वपूर्ण है यदि कक्षाओं का उपयोग किसी अन्य डेटा संरचना में किया जा सकता है, जैसे कि सेट, जो hashCode पर निर्भर करता है, equals साथ संगत equals

कोई hashCode() नहीं है hashCode() जो विशिष्ट रूप से एक ऑब्जेक्ट का एक उदाहरण पहचानता है, चाहे कोई भी हो। यदि आप अंतर्निहित सूचक पर आधारित हैशकोड चाहते हैं (जैसे कि सूर्य के कार्यान्वयन में), तो सिस्टम System.identityHashCode() उपयोग System.identityHashCode() – यह डिफ़ॉल्ट hashCode विधि को सौंप देगा, चाहे वह ओवरराइड हो गया हो।

फिर भी, यहां तक ​​कि System.identityHashCode() एकाधिक ऑब्जेक्ट के लिए उसी हैश वापस कर सकते हैं। एक स्पष्टीकरण के लिए टिप्पणियां देखें, लेकिन यह एक ऐसा उदाहरण कार्यक्रम है जो लगातार ऑब्जेक्ट जनरेट करता है, जब तक कि वह एक ही System.identityHashCode() साथ दो खोजता न हो। पहचान System.identityHashCode() जब मैं इसे चलाता हूं, तो यह जल्दी से दो System.identityHashCode() पाता है। System.identityHashCode() उस मैच को औसत पर करीब 86,000 लम्बी आवरण वस्तुओं (और कुंजी के लिए इंटीजर रैपर) को जोड़ने के बाद।

 public static void main(String[] args) { Map<Integer,Long> map = new HashMap<>(); Random generator = new Random(); Collection<Integer> counts = new LinkedList<>(); Long object = generator.nextLong(); // We use the identityHashCode as the key into the map // This makes it easier to check if any other objects // have the same key. int hash = System.identityHashCode(object); while (!map.containsKey(hash)) { map.put(hash, object); object = generator.nextLong(); hash = System.identityHashCode(object); } System.out.println("Identical maps for size: " + map.size()); System.out.println("First object value: " + object); System.out.println("Second object value: " + map.get(hash)); System.out.println("First object identityHash: " + System.identityHashCode(object)); System.out.println("Second object identityHash: " + System.identityHashCode(map.get(hash))); } 

उदाहरण आउटपुट:

 Identical maps for size: 105822 First object value: 7446391633043190962 Second object value: -8143651927768852586 First object identityHash: 2134400190 Second object identityHash: 2134400190 

यदि आप जानना चाहते हैं कि कैसे उन्हें आरोपित किया गया है, तो मेरा सुझाव है कि आप स्रोत को पढ़ें। यदि आप एक IDE का उपयोग कर रहे हैं तो आप केवल उस विधि पर + जिसे आप रुचि रखते हैं और देखें कि एक विधि कैसे कार्यान्वित होती है यदि आप ऐसा नहीं कर सकते हैं, तो आप स्रोत के लिए Google कर सकते हैं।

उदाहरण के लिए, Integer.hashCode () को इस रूप में लागू किया जाता है

  public int hashCode() { return value; } 

और स्ट्रिंग.hashCode ()

  public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; } 

मैंने पढ़ा है कि यह एक वस्तु का एक मेमोरी संदर्भ है ..

नं। Object.hashCode() को लगभग 14 साल पहले एक मेमोरी एड्रेस वापस करने के लिए इस्तेमाल किया गया था। के बाद से नहीं।

किस प्रकार का मूल्य है

यह पूरी तरह से निर्भर करता है कि आप किस वर्ग के बारे में बात कर रहे हैं और क्या यह ओवरराइड किया गया है या नहीं। Object.hashCode ()

hashCode() पद्धति का उपयोग अक्सर किसी ऑब्जेक्ट की पहचान करने के लिए किया जाता है। मुझे लगता है कि Object क्रियान्वयन Object के पॉइंटर (वास्तविक पॉइंटर नहीं बल्कि एक अनन्य आईडी या कुछ ऐसा) देता है लेकिन अधिकांश कक्षाएं विधि को ओवरराइड करती हैं। String कक्षा की तरह दो स्ट्रिंग ऑब्जेक्ट्स समान पॉइंटर नहीं हैं लेकिन वे समान हैं:

 new String("a").hashCode() == new String("a").hashCode() 

मुझे लगता है कि hashCode() लिए सबसे आम उपयोग Hashtable , HashSet आदि में है।

जावा एपीआई ऑब्जेक्ट हैशोड ()

संपादित करें: (एक हालिया डाउनवॉट के कारण और एक लेख के आधार पर मैंने जेवीएम मापदंडों के बारे में पढ़ा है)

जेवीएम पैरामीटर के साथ -XX:hashCode आप -XX:hashCode कैसे गणना करते हैं (जावा विशेषज्ञ के न्यूज़लैटर के अंक 222 देखें) को बदल सकते हैं।

हॅशकोड == 0: सिर्फ़ यादृच्छिक संख्या को रिश्ते के साथ देता है जहां स्मृति में ऑब्जेक्ट पाया जाता है। जहाँ तक मैं बाहर कर सकता हूं, बीज की वैश्विक रीड-लिस्ट प्रोसेसर्स के बहुत से सिस्टम के लिए इष्टतम नहीं है

हैशोड == 1: हैश कोड मानों की गणना करता है, यह सुनिश्चित नहीं है कि वे किस मूल्य को शुरू करते हैं, लेकिन यह काफी अधिक लगता है।

हॅशकोड == 2: हमेशा सटीक उसी पहचान हैश कोड 1 देता है। यह कोड का परीक्षण करने के लिए उपयोग किया जा सकता है जो ऑब्जेक्ट पहचान पर निर्भर करता है। इसका कारण यह है कि जावा चाइम्बोनटेस्ट ने ऊपर दिए गए उदाहरण में किर्क का यूआरएल वापस कर दिया है कि सभी ऑब्जेक्ट्स उसी हैश कोड को वापस कर रहे थे।

हॅशकोड == 3: हश कोड मान को जोड़ता है, जो शून्य से शुरू होता है। यह धागा सुरक्षित नहीं दिखता है, इसलिए कई धागे ही हैश कोड वाले ऑब्जेक्ट उत्पन्न कर सकते हैं।

हॅशकोड == 4: इस मेमोरी स्थान के साथ कुछ संबंध होने लगता है जिस पर ऑब्जेक्ट बनाया गया था।

हाशोड> = 5: यह जावा 8 के लिए डिफ़ॉल्ट एल्गोरिथ्म है और प्रति-धागा बीज है। यह छद्म यादृच्छिक संख्याओं का उत्पादन करने के लिए मार्सग्लिया की एक्सर-शिफ्ट योजना का उपयोग करता है।

ऑब्जेक्ट.hashCode (), यदि मेमोरी सही ढंग से कार्य करता है (java.lang.Object के लिए जावाडॉक की जाँच करें), कार्यान्वयन-निर्भर है, और ऑब्जेक्ट के आधार पर बदल जाएगा (सूर्य JVM ऑब्जेक्ट के संदर्भ के मान से मूल्य प्राप्त करता है )।

ध्यान दें कि यदि आप किसी भी नॉनट्रियल ऑब्जेक्ट को लागू कर रहे हैं, और उन्हें किसी हैशमैप या हैशसेट में सही ढंग से संगृहीत करना चाहते हैं, तो आपको हैशोड () और बराबर () को ओवरराइड करना होगा। हैश कोड () जो भी आप चाहें कर सकते हैं (यह पूरी तरह से कानूनी है, लेकिन यह 1 पर वापस लौटना है।), लेकिन यह महत्वपूर्ण है कि यदि आपकी बराबर () विधि रिटर्न सही होती है, तो दोनों ऑब्जेक्ट के लिए हैशोड () द्वारा दिया गया मूल्य बराबर है।

भ्रम और हैशोड () और बराबर () की समझ की कमी बगों का एक बड़ा स्रोत है। सुनिश्चित करें कि आप अपने आप को Object.hashCode () और Object.equals () के लिए JavaDocs के साथ अच्छी तरह परिचित करते हैं, और मैं गारंटी देता हूं कि व्यतीत किया गया समय स्वयं के लिए भुगतान करेगा।

 public static int murmur3_32(int paramInt1, char[] paramArrayOfChar, int paramInt2, int paramInt3) { /* 121 */ int i = paramInt1; /* */ /* 123 */ int j = paramInt2; /* 124 */ int k = paramInt3; /* */ /* */ int m; /* 127 */ while (k >= 2) { /* 128 */ m = paramArrayOfChar[(j++)] & 0xFFFF | paramArrayOfChar[(j++)] << '\020'; /* */ /* 130 */ k -= 2; /* */ /* 132 */ m *= -862048943; /* 133 */ m = Integer.rotateLeft(m, 15); /* 134 */ m *= 461845907; /* */ /* 136 */ i ^= m; /* 137 */ i = Integer.rotateLeft(i, 13); /* 138 */ i = i * 5 + -430675100; /* */ } /* */ /* */ /* */ /* 143 */ if (k > 0) { /* 144 */ m = paramArrayOfChar[j]; /* */ /* 146 */ m *= -862048943; /* 147 */ m = Integer.rotateLeft(m, 15); /* 148 */ m *= 461845907; /* 149 */ i ^= m; /* */ } /* */ /* */ /* */ /* 154 */ i ^= paramInt3 * 2; /* */ /* */ /* 157 */ i ^= i >>> 16; /* 158 */ i *= -2048144789; /* 159 */ i ^= i >>> 13; /* 160 */ i *= -1028477387; /* 161 */ i ^= i >>> 16; /* */ /* 163 */ return i; /* */ } 

यदि आप वास्तव में जानने के लिए उत्सुक हैं तो हाशिंग। क्लास में उपलब्ध इस कोड के माध्यम से जाएं;

यहां पहले परम HASHING_SEED की गणना नीचे के कोड के आधार पर की जाती है

  { long nanos = System.nanoTime(); long now = System.currentTimeMillis(); int SEED_MATERIAL[] = { System.identityHashCode(String.class), System.identityHashCode(System.class), (int) (nanos >>> 32), (int) nanos, (int) (now >>> 32), (int) now, (int) (System.nanoTime() >>> 2) }; // Use murmur3 to scramble the seeding material. // Inline implementation to avoid loading classes int h1 = 0; // body for (int k1 : SEED_MATERIAL) { k1 *= 0xcc9e2d51; k1 = (k1 << 15) | (k1 >>> 17); k1 *= 0x1b873593; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); h1 = h1 * 5 + 0xe6546b64; } // tail (always empty, as body is always 32-bit chunks) // finalization h1 ^= SEED_MATERIAL.length * 4; // finalization mix force all bits of a hash block to avalanche h1 ^= h1 >>> 16; h1 *= 0x85ebca6b; h1 ^= h1 >>> 13; h1 *= 0xc2b2ae35; h1 ^= h1 >>> 16; HASHING_SEED = h1; } 

दूसरा परम स्ट्रिंग के चार सरणी है, तीसरा हमेशा '0' होता है और चौथे एक में चार सरणी लंबाई होती है

और उपरोक्त गणना स्ट्रिंग हैश कोड के लिए है।

सभी पूर्णांक के लिए, इसका हैश कोड इसका पूर्णांक मान होगा चार (दो पत्र तक) के लिए यह एएससीआईआई कोड होगा।