कुछ प्रमुख JVM वर्गों (जैसे String या List implementations) को लागू हर field_n
कि equals
विधि के लिए प्रासंगिक है के लिए Σ 31^n * field_n.hashCode()
वापस लौट कर बराबर होती है। इसके अलावा, प्रभावशाली जावा (आइटम 9) में जोशुआ ब्लोच द्वारा इस दृष्टिकोण की सिफारिश की जाती है।hashCode कार्यान्वयन रणनीतियों
हालांकि, Map.Entry
implementations जैसे अन्य वर्ग विभिन्न नियमों का पालन करते हैं। उदाहरण के लिए, Map.Entry प्रलेखन कहा गया है कि एक Map.Entry
के हैश कोड होना चाहिए
(e.getKey()==null ? 0 : e.getKey().hashCode())^
(e.getValue()==null ? 0 : e.getValue().hashCode())
यह कभी कभी हैश तालिकाओं में उपयोग करने के लिए अव्यावहारिक हो सकता है, के बाद से:
- सभी प्रविष्टियों का हैश कोड जिसमें एक ही कुंजी और मान 0 है,
- दो प्रविष्टियां ई 1 और ई 2 ताकि e1.key = e2.value और e1.value = e2.key के पास एक ही हैश कोड हो।
क्यों जावा उदाहरण, 31 * (e.getKey()==null ? 0 : e.getKey().hashCode()) + (e.getValue()==null ? 0 : e.getValue().hashCode())
के लिए, के बजाय Map.Entry
hashCode के लिए इस कार्यान्वयन विनिर्देश चुना?
संपादित करें 1:
समस्या यह पता लगाने में मदद करने के लिए, यहाँ है, जहाँ परिणाम हैश टकराव के कारण बहुत खराब प्रदर्शन है, तो कई प्रविष्टियों एक ही कुंजी और मान होना उपयोगी कोड का एक उदाहरण है।
यह विधि विभिन्न मानचित्रों की प्रविष्टियों की आवृत्तियों की गणना करती है (गुवा के मल्टीसेट का उपयोग करके)।
public static <K, V> Multiset<Map.Entry<K, V>> computeEntryCounts(
Iterable<Map<K, V>> maps) {
ImmutableMultiset.Builder<Map.Entry<K, V>> result = ImmutableMultiset.builder();
for (Map<K, V> map : maps) {
for (Map.Entry<K, V> entry : map.entrySet()) {
result.add(entry);
}
}
return result.build();
}
आपका कार्यान्वयन कुंजी और मूल्य ** शून्य ** के आउटपुट को प्रभावित नहीं करता है। इसके अलावा, जावा में एक मानचित्र में एक कुंजी के साथ ** एक ** प्रविष्टि नहीं है, किसी भी मानचित्र कार्यान्वयन में केवल एक बार ** ** होता है। –
मुझे पता है, मैं मान रहा था कि हैश मैप की चाबियाँ मैप के उदाहरण हैं। एंटर्री। ऐसा तब हो सकता है जब आप कई मानचित्रों में प्रत्येक कुंजी-मूल्य प्रविष्टि के लिए कुल गणना की गणना करना चाहते हैं। – jpountz
मैं नहीं देख सकता कि यह इस मामले को कैसे प्रभावित करेगा, जब तक कि आप सभी मानचित्रों को एक मानचित्र के अंदर सभी मानचित्रों से गिनने के लिए नहीं चाहते हैं, लेकिन यह स्पष्ट रूप से गलत होगा। –