क्या जावा के हैशकोड फ़ंक्शन का उपयोग करके अलग-अलग तारों के लिए एक ही हैशकोड होना संभव है? या यदि यह संभव है तो इसकी संभावना का% क्या है?जावा के हैशकोड अलग-अलग तारों के लिए समान मूल्य उत्पन्न कर सकते हैं?
उत्तर
जावा हैश कोड 32 बिट है। संभव है कि यह संभव तारों की संख्या अनंत है।
तो हाँ, टकराव होंगे। प्रतिशत व्यर्थ है - वस्तुओं की एक अनंत संख्या (तार) और संभावित हैश की एक सीमित संख्या है।
यह सीधे आपके प्रश्न का उत्तर नहीं देगा, लेकिन मुझे आशा है कि इससे मदद मिलेगी।
नीचे java.lang.String
के स्रोत कोड से है।
/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
हाँ, कबूतर छेद अवधारणा की परिभाषा के द्वारा, दो अलग अलग तार एक ही hashCode उत्पादन कर सकते हैं और कोड हमेशा इस तरह की स्थितियों के लिए पूरा करने के लिए लिखा जाना चाहिए (आमतौर पर, तोड़ नहीं है।)
हाँ । बहुत। जोड़ी
- "अमेरिकन प्लान" और "ईए"
एक ही हैश कोड लौट सकते हैं, भले ही यह में पात्रों ही नहीं हैं निम्नलिखित पर
देखो।
असल में यह एक पूर्णांक द्वारा गुणा स्ट्रिंग में वर्णों का योग है।
हाँ, यह संभव है दो स्ट्रिंग्स ही hashCode के लिए के लिए - आप Wikipedia article पर एक नज़र डालें, तो आप उस "FB"
और "Ea"
दोनों एक ही hashCode है देखेंगे। विधि अनुबंध में कुछ भी नहीं है कि hashCode()
समानता की तुलना करने के लिए उपयोग किया जाना चाहिए, इसके लिए आप equals()
का उपयोग करना चाहते हैं।
जावा 1.2 के बाद से, स्ट्रिंग hashCode()
using a product sum algorithm over the entire text of the string लागू करता है।
यदि यह संभव है तो इसकी संभावना का% क्या है?
यह एक विशेष रूप से सार्थक सवाल नहीं है।
हालांकि, hashcode
फ़ंक्शन में कुछ व्यवस्थित पूर्वाग्रह होने तक, संभावना है कि किसी भी दो अलग-अलग (गैर-बराबर) स्ट्रिंग्स में एक ही हैश कोड 2^32 में 1 होगा।
यह मानता है कि स्ट्रिंग्स को सभी संभव स्ट्रिंग मानों के सेट से यादृच्छिक रूप से चुना जाता है। यदि आप सेट को विभिन्न तरीकों से प्रतिबंधित करते हैं, तो संभावना उपर्युक्त संख्या से भिन्न होगी। (उदाहरण के लिए, "अमेरिकन प्लान"/"ईए" टक्कर के अस्तित्व का मतलब है सभी 2 पत्र तार के सेट में एक टक्कर की संभावना के आदर्श से अधिक है।)
नोट करने के लिए एक और बात है कि यादृच्छिक रूप से चुने गए 2^32 अलग-अलग तारों का मौका (स्ट्रिंग्स के बहुत बड़े निष्पक्ष सेट से) कोई हैश टकराव नहीं है गायब होकर छोटा।समझने के लिए, Birthday Paradox पर विकिपीडिया पृष्ठ पढ़ें। हकीकत में, यदि आप स्ट्रिंग का चयन या उत्पन्न करते हैं तो 2^32 अलग-अलग तारों के सेट में कोई हैश टक्कर नहीं मिलने वाला एकमात्र तरीका है। (और यहां तक कि यादृच्छिक रूप से जेनरेट किए गए तारों का चयन करके सेट भी बनाकर कम्प्यूटेशनल रूप से महंगा होगा।)
तो, मैं कह सकता हूँ कि 2^32 विभिन्न स्ट्रिंग्स के लिए, hashCode समारोह हमेशा अलग हैशकोड का उत्पादन करेगा? – Xara
@Zara - नहीं आप नहीं कर सकते। 1^2 में 1 32 संभावना का एक उपाय है। इसके बारे में सोचो। मान लीजिए कि आपने स्ट्रिंग के साथ 2^32 स्ट्रिंग्स के सेट को पॉप्युलेट किया है, जिसमें सभी के पास एक ही हैशकोड है ... –
@Zara असल में यह बिल्कुल विपरीत कहता है! 2^32 अलग-अलग तार होने के कारण आपको सबसे अधिक टक्कर होगी (या यहां तक कि कई ..)। – jorey
यादृच्छिक तारों के लिए टकराव का प्रतिशत न्यूनतम होना चाहिए। हालांकि, अगर आप बाहरी स्रोतों से हैश स्ट्रिंग करते हैं, तो हमलावर आसानी से सैकड़ों हजारों तारों को एक ही हैशकोड बना सकता है। जावा हैश मैप में ये सभी एक ही बाल्टी पर नक्शा करेंगे और प्रभावी ढंग से मानचित्र को एक लिंक सूची में बदल देंगे। मानचित्र के लिए एक्सेस समय तब स्थिरता के बजाय मानचित्र आकार के आनुपातिक होंगे, जिससे सेवा हमले से इनकार किया जा सकता है।
प्रस्तुति के लिए और जानकारी लिंक के लिए इस पृष्ठ को Effective DoS attacks against Web Application Plattforms पर देखें।
हां, यह पूरी तरह से संभव है। एक स्ट्रिंग की संभावना (या कुछ अन्य ऑब्जेक्ट प्रकार - केवल यह मानते हुए कि आप इस उदाहरण में तारों का उपयोग करेंगे) एक संग्रह में कुछ अन्य स्ट्रिंग के समान हैशकोड होने पर, उस संग्रह के आकार पर निर्भर करता है (मानते हुए कि सभी तार वह संग्रह अद्वितीय हैं)। संभावनाओं के रूप में निम्नानुसार वितरित कर रहे हैं:
-
आकार ~ 9000 का एक सेट के साथ
- , आप सेट आकार ~ 30,000 का एक सेट के साथ
- में एक हैश के साथ टकराने दो तार के एक 1% मौका होगा, सेट
- आकार में एक हैश के साथ टकराव के दो तारों का 10% मौका होगा, आकार ~ 77,000 के सेट के साथ, आपके पास सेट
धारणाएं बनाई गई हैं:
- hashCode समारोह कोई पूर्वाग्रह है
- ऊपर उल्लिखित सेट में प्रत्येक स्ट्रिंग अद्वितीय है
इस साइट में यह स्पष्ट रूप से बताते हैं: http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/ ("दूसरी बात आपको पता होना चाहिए" को देखो)
तारों के लिए वर्णों का सेट क्या है जहां उन्होंने परीक्षण किया है? –
- 1. तारों के लिए डीडीडी खाता कर सकते हैं?
- 2. जावा में एक ही हैशकोड साझा करने वाले तारों को कैसे उत्पन्न करें?
- 3. हैशकोड के लिए हैशकोड और बराबर
- 4. जावा हैशकोड को "मास्टर" हैशकोड
- 5. जावा - तारों के भीतर चर शामिल हैं?
- 6. लिंक के साथ पीडीएफ उत्पन्न कर सकते हैं?
- 7. क्यों हैशकोड() लगातार सभी निष्पादन में ऑब्जेक्ट के लिए समान मान देता है?
- 8. मानचित्र के अंदर एक बुलियन मूल्य के लिए आप कैसे परीक्षण कर सकते हैं?
- 9. पुनर्विक्रेता प्रारूप केस स्टेटमेंट्स केस के समान लाइन पर शुरू करने के लिए कर सकते हैं?
- 10. स्कैला - जावा इंटरऑप: जावा के लिए बाइटकोड में स्कैला उत्सर्जित कर सकते हैं?
- 11. हाइबरनेट उपकरण जेपीए POJO उत्पन्न कर सकते हैं?
- 12. MySQL के साथ तारों को जोड़ सकते हैं ||
- 13. जावा - ट्रीसेट और हैशकोड()
- 14. क्या नोडजेएस एसएसएल प्रमाण पत्र उत्पन्न कर सकते हैं?
- 15. ऐरेलिस्ट - "समान" ऑब्जेक्ट्स जोड़ें (समान => बराबर, हैशकोड), थ्रेड
- 16. जावा हैशटेबल # हैशकोड() कार्यान्वयन टूटा हुआ है?
- 17. जावा के लिए "कुंजी-मूल्य कोडिंग"
- 18. जावा ऐप्स वीबी ऐप्स के साथ एकीकृत कर सकते हैं?
- 19. जावा ऐरे हैशकोड कार्यान्वयन
- 20. समानता के लिए .NET परीक्षण सरणी और केवल समान संदर्भ नहीं कर सकते हैं?
- 21. जावा में लाइन चार्ट के लिए समान चमक के विभिन्न रंग कैसे उत्पन्न करें?
- 22. जा सकते हैं कोड विंडोज़ में डीएल उत्पन्न कर सकते हैं या सी ++/सी # कॉल गोलांग कोड कर सकते हैं?
- 23. मैं कैसे परिवर्तित कर सकते हैं जावा
- 24. क्या कर सकते हैं कि sed क्या कर सकते हैं?
- 25. थ्रेड्स समान क्लाइंट सॉकेट साझा कर सकते हैं?
- 26. सी ++ जावा कोड कॉल कर सकते हैं?
- 27. मैं कैसे आयात कर सकते हैं Fiddler-उत्पन्न आईओएस डिवाइस के लिए प्रमाणपत्र
- 28. विभिन्न सीपीयू के लिए जीसीसी क्रॉस संकलन कर सकते हैं?
- 29. आप एंड्रॉइड में लोडिंग स्क्रीन कैसे उत्पन्न कर सकते हैं?
- 30. जावा: स्वचालित बराबर() और हैशकोड()
से नीचे adarshr द्वारा पोस्ट की गई स्ट्रिंग.hashcode() विधि का संदर्भ लें, तो क्या मैं कह सकता हूं कि यह 2^32 विभिन्न हैंश उत्पन्न कर सकता है और उसके बाद यह हैशकोड दोहराएगा ?? – Xara
यदि आप 2^32 स्ट्रिंग्स को पहचानने में कामयाब होते हैं, जिनमें सभी के पास एक अलग हैशकोड है, तो हां, उस सूची में मौजूद किसी भी अन्य स्ट्रिंग के पास उस सूची में एक ही हैशकोड नहीं होगा। – Mat
एक तरफ ध्यान दें, इसे कबूतर सिद्धांत कहा जाता है http://en.wikipedia.org/wiki/Pigeonhole_principle –