2010-02-12 10 views
8

String.hashCode() के वर्तमान कार्यान्वयन पर भरोसा करना सुरक्षित है या नहीं, क्योंकि तकनीकी रूप से बोलते हुए, यह विनिर्देश (जावाडोक) द्वारा गारंटीकृत है, इस बारे में एक सतत बहस है।सूर्य ने स्ट्रिंग.hashCode() कार्यान्वयन क्यों निर्दिष्ट किया?

  1. सूर्य ने String.hashCode() के विनिर्देशन में कार्यान्वयन क्यों निर्दिष्ट किया?
  2. डेवलपर्स को हैशकोड() के विशिष्ट कार्यान्वयन पर भरोसा करने की आवश्यकता क्यों होगी?
  3. सूर्य इतना डर ​​क्यों है कि भविष्य में String.hashCode() बदल दिया गया है तो आकाश गिर जाएगा? (यह संभवतः # 2 द्वारा समझाया जा सकता है)

उत्तर

8

हैशकोड() के विशिष्ट कार्यान्वयन पर भरोसा करने का एक कारण यह होगा कि यह किसी डेटाबेस, फ़ाइल या किसी अन्य स्टोरेज माध्यम में हमेशा जारी रहता है। खराब चीजें (टीएम) तब होती है जब डेटा को वापस पढ़ा जाता है जब हैशिंग एल्गोरिदम बदल गया था। आप अप्रत्याशित हैश टकराव का सामना कर सकते हैं, और अधिक चिंताजनक रूप से, इसके हैश द्वारा कुछ खोजने में असमर्थता क्योंकि डेटा जारी रखने और "अब" के बीच हैश बदल गया था।

वास्तव में, कि काफी भी बिंदु # 3 बताते =)

बिंदु # 1 के लिए कारण हो सकता है "अंतर अनुमति देने के लिए"। यदि हैशकोड कार्यान्वयन लॉक हो गया है तो डेटा को जावा के विभिन्न कार्यान्वयन के बीच सुरक्षित रूप से साझा किया जा सकता है। यानी, किसी दिए गए ऑब्जेक्ट का हैश हमेशा कार्यान्वयन के बावजूद समान होगा।

+1

अच्छा बिंदु! मुझे आश्चर्य है ... क्या वे हैशकोड() को लॉक किए बिना वही चीज़ हासिल कर सकते हैं? – Gili

+0

@Gili, "कार्यान्वयन और VersionIndependentHashCode()" नामक विधि जोड़ने के बिना नहीं ;-) – Rob

+0

@Gili अगर उन्होंने हैशकोड को लॉक नहीं किया है, तो वे कैसे सुनिश्चित कर सकते हैं कि आरएमआई के माध्यम से जुड़े दो मशीनें आगे और आगे हो सकती हैं? मेरा अनुमान है कि आपको सिर्फ एक साझा हैश की अवधारणा को छोड़ना है। –

4

कार्यान्वयन मूल String कक्षा के बाद बदल गया है। अगर मुझे याद है, तो यह होता था कि "लंबे" तारों के लिए हैश में केवल 16 वें (?) चरित्र का उपयोग किया जाता था।

यह जावा के बाद के संस्करणों के बीच क्रमशः इंटरऑपरेबिलिटी को बढ़ावा देने के लिए निर्दिष्ट किया जा सकता है, या यहां तक ​​कि विभिन्न विक्रेताओं के रनटाइम के बीच भी। मैं मानता हूं, एक प्रोग्रामर को सीधे hashCode() के विशेष कार्यान्वयन पर भरोसा नहीं करना चाहिए, लेकिन इसे बदलने से क्रमशः बहुत क्रमबद्ध संग्रहों को तोड़ सकता है।

+0

मूल विनिर्देश 'ArrayOUtOfBoundsException' को फेंकना था। :) आईआईआरसी, लंबे तारों के कार्यान्वयन ने अक्षरों की एक निश्चित संख्या का नमूना लिया, इसलिए ओ (एन) के बजाय ओ (1) लेकिन एक बुरा हैश और उपयोगी कुछ भी के लिए स्ट्रिंग का उपयोग करना (कम से कम) ओ (एन) वैसे भी होगा। –