जावा 8 प्रदर्शन में सुधार के लिए स्ट्रिंग कुंजी के लिए वैकल्पिक हैशिंग प्रदान कर रहा है जब बड़ी संख्या में कुंजी हैश कोड टकराव का सामना करना पड़ता है। क्या कोई यह समझा सकता है कि यह क्या है और यह कैसे काम करेगा?जावा 8 में स्ट्रिंग कुंजी के लिए वैकल्पिक हैशिंग क्या है?
उत्तर
[email protected]
की
this email से
:
- एक नया इंटरफेस Hashable32 शुरू की है।
- Hashable32 एक विधि hash32()
- स्ट्रिंग लागू करता Hashable32 और hash32() विधि
- HashMap एट अल स्ट्रिंग समझते हैं और hash32 (आह्वान) के बजाय hashCode()
के संशोधन प्रदान करता है कोड:
- Murmur3: https://code.google.com/p/smhasher/wiki/MurmurHash3
- althashing "7" webrev : http://cr.openjdk.java.net/~mduigou/althashing7/8/webrev/
- althashing "8" webrev: http://cr.openjdk.java.net/~mduigou/althashing8/8/webrev/
जो मैं बता सकता हूं, पुराने हैशिंग एल्गोरिदम के साथ सबसे बड़ी खामियां थीं कि कभी-कभी लंबे तारों के लिए शून्य लौटा दी जाती है, और यह कि एक विशेष कार्यान्वयन को निर्दिष्ट करने से वीएम को "हैश-स्ट्रिंग" फ़ंक्शन लागू करने की संभावना को रोक दिया गया था जिसे डिजाइन किया गया था उस विशेष मशीन पर इष्टतम प्रदर्शन (उदाहरण के लिए एक 64-बिट मशीन एक फ़ंक्शन का उपयोग कर सकती है जो 8 बाइट्स के समूहों पर चलती है और फिर परिणाम को 32 बिट्स तक पहुंचाती है)। मुझे आश्चर्य है कि पुराना स्ट्रिंग हैश के सटीक मूल्यों पर वास्तव में कितना कोड निर्भर करता है, और 'संगतता कार्यवाही' की अनुमति देना कितना मुश्किल होगा? – supercat
यह ध्यान देने योग्य है कि MurmurHash3 को पारी Dos हमलों पर रोक नहीं लगेगी: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/
इस सवाल का अधिक प्रासंगिकता लाने के लिए, वैकल्पिक हैशिंग को जेडीके 8 से हटा दिया गया है। चेक आउट:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
यह ध्यान रखें कि एक बार एक हैश बकेट में आइटम की संख्या एक निश्चित सीमा से परे होती है, कि बाल्टी एक संतुलित पेड़ से प्रविष्टियों में से एक लिंक्ड सूची का उपयोग करने से स्विच करेंगे दिलचस्प है।
हैश (वस्तु कुंजी) HashMap में समारोह संशोधित किया गया है करने के लिए स्ट्रिंग वस्तुओं के लिए कोई विशेष उपचार के साथ इस प्रकार है:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16);
}
+1 इस सेवा हमलों के इनकार से बचने के लिए इस्तेमाल किया जा सकता। –
धन्यवाद, मैं इसे ध्यान में रखूंगा –
@ पीटर लेवरी क्या आप [इस बग रिपोर्ट] (https://bugzilla.redhat.com/show_bug.cgi?id=750533) या कुछ और करते हैं जब आप DoS का उल्लेख करते हैं? –