2014-11-08 5 views
5

आइटम 9 प्रभावी जावा के, 2 edn के आखिरी पैरा, जे बलोच का कहना है कि, Integer की तरह मूल्य कक्षाएं, String, Date आदि के लिए, इस बात का सही मूल्य के एक समारोह लौटने hashCode के रूप में वर्ग एक अच्छा विचार नहीं है।वैल्यू क्लास का मूल्य हैश कोड के रूप में "अच्छा विचार नहीं" क्यों है?

तो, वर्ग Integer पूर्णांक के value लौटने पर यह hashCode के उदाहरण के रूप में प्रतिनिधित्व करता है, यह सब इतना अच्छा नहीं है।

न तो String की hashCode() सीधे समग्र सामग्री से मैप किया गया मान एक पूर्णांक लौटने है, जैसे कि, वर्ण String उदाहरण है।

ये hashCode()-स्पष्ट रूप से अनुबंध का अनुपालन करते हैं।

मेरे लिए, यह एक बुरे के बजाय एक अच्छा विचार प्रतीत होता है - hashCode-भिन्नता के रूप में भिन्नता भिन्न होती है, और hashCodes वे "सामान्यीकृत" हैं, इससे पहले कि वे बाल्टी में फैल जाएं HashMap/HashSet - ताकि प्रविष्टियों की hashCode -s एक पूर्वाग्रह है जिस पर प्रविष्टि में जाना होगा बाल्टी फार्म नहीं है

क्या मैं यहाँ याद आ रही है -। क्या hashCode एक "बुरा करने के लिए सीधे वर्ग मूल्य मानचित्रण बनाता है विचार"?

TIA

// ===========================

संपादित

कृपया यह भी देखना इस संबंध में स्टीव सिबर्ट के जवाब के तहत टिप्पणियां।

उत्तर

4

क्या यह कह रहा है उन जावाडोक विनिर्देश का कहना है कि वास्तव में कैसे hashCode बनाया जाता है। ऐसा करके, एप्लिकेशन अब इस पर हमेशा सत्य होने पर निर्भर हो सकते हैं ... और अब उन कार्यान्वयनों को हैशकोड उत्पन्न करने के तरीके को कभी भी नहीं बदला जा सकता है।

इसका मतलब यह नहीं है कि आपको अपने मूल्यों से अपने हैश नहीं प्राप्त करना चाहिए ...बस लोगों को कैसे आप अपने विनिर्देश में ऐसा =

+0

उस से सहमत हैं। लेकिन इसका समाधान एक सिद्धांत को मजबूर करना चाहिए कि "' हैशकोड 'को' मान' 'के संकेतक/कार्यात्मक विकल्प के रूप में उपयोग नहीं किया जाना चाहिए, बल्कि ' मूल्य 'और 'हैशकोड के बीच उस अच्छे रिश्ते के बीच में होने के बजाय() 'और इस प्रकार' बराबर() 'और' हैशकोड() 'के बीच। – Roam

+0

मैं पूरी तरह से आपसे सहमत हूं, एक हैशकोड अभ्यास में एक ऐसे व्यक्ति के रूप में माना जा सकता है जो ऑब्जेक्ट के वास्तविक मूल्य के "कम बुद्धिमान/हानिकारक" प्रतिनिधित्व को लौटाता है - जन्मदिन के विरोधाभास के लिए अतिसंवेदनशील। लेकिन, वास्तव में, एक हैश आवश्यक नहीं है * मूल्य * के साथ relationhsip है ... हैशकोड हमेशा एक ही वस्तु के लिए एक ही int मान वापस करने की जरूरत है (हालांकि यह आपके द्वारा परिभाषित किया गया है) तो वस्तु में पाया जा सकता है अपेक्षित बाल्टी आम तौर पर यह वस्तु के एक/अधिक मूल्यों को हैशिंग करके किया जाता है ... जो समझ में आता है। लेकिन, अगर यह किया जा सकता है, तो कहें ... जादू ... तो मैं न्याय करने के लिए कौन हूं? =) –

+0

'हैशकोड' से 'मान' को चिपकाने की संभावना है" अगर दो ऑब्जेक्ट्स बराबर नहीं हैं, न तो उनके हैशकोड हैं "और हैश बाल्टी में समान रूप से वितरित प्रविष्टियों के लिए यह अच्छी बात है - हालांकि यह नहीं है अनुबंध द्वारा एक आवश्यकता है। मैंने न तो देखा और न ही ऐसा करने का बेहतर तरीका सोच सकता हूं। – Roam

-1

जावा एपीआई बस इतना करता है, यह पूर्णांक देता है।

Integer t = ...; 
t.intValue() == t.hashCode(); // true 

मेरे पास काम पर एक ही पुस्तक है। मैं सोमवार को इसे देख लूंगा।

तुम सच में चिंतित हैं, FNV-1a हैश लागू:

int hash = 0x4C1DF00D; 
    hash = (hash^value) * 0x01000193; 
+0

मुझे आश्चर्य है कि डाउनवोट क्यों? मैं @ सोटीरियोसेलिमैनोलिस के समान निष्कर्ष पर आने की योजना बना रहा था, लेकिन मेरे पास दूसरी जगह है और मुझे नहीं पता था कि यह मुफ्त ऑनलाइन उपलब्ध है। –

3

नहीं बताया) full quote Integer जावा मंच पुस्तकालयों में

कई कक्षाएं, जैसे String, और Date है, में शामिल उनके विनिर्देशों का सटीक मान उदाहरण मूल्य के फ़ंक्शन के रूप में उनके hashCode विधि द्वारा लौटाया गया। यह आम तौर पर एक अच्छा विचार नहीं है, क्योंकि भविष्य में रिलीज में हैश फ़ंक्शन को बेहतर बनाने के लिए यह आपकी क्षमता को गंभीर रूप से सीमित करता है। यदि आप को हैश फ़ंक्शन के विवरण निर्दिष्ट नहीं करते हैं और एक दोष पाया जाता है या बेहतर हैश फ़ंक्शन खोजा जाता है, तो आप में रिलीज़ हैश फ़ंक्शन को बाद में रिलीज़ में बदल सकते हैं, भरोसा है कि कोई भी ग्राहक हैश द्वारा लौटाए गए मानों पर निर्भर नहीं है समारोह।

जोर मेरा। पुस्तक सिर्फ यह कह रही है कि इसे एक विनिर्देश में कार्यान्वयन विवरण प्रकट करने के लिए आम तौर पर बुरी आदत माना जाता है। यह इसे बदलने के लिए प्रतिरोधी बनाता है।

तथ्य यह है कि इसे एक सटीक मूल्य (Integer के लिए) या कुछ गणना मूल्य (Date और String के लिए) के रूप में कार्यान्वित किया गया था, यह बुरा नहीं है।

संबंधित मुद्दे