हमें बताया गया है कि हमें अपनी कक्षाओं के लिए हैशकोड() को लागू करना चाहिए, लेकिन मेरे जैसे अधिकांश लोगों को यह नहीं पता कि यह कैसे करना है या अगर हमें "गलत" मिलता है तो क्या होता है। उदाहरण के लिए मुझे पेड़ (Finding the most frequent subtrees in a collection of (parse) trees) में इंडेक्सिंग नोड्स के लिए हैश फ़ंक्शन की आवश्यकता है। इस मामले में मुझे क्रमशः बाल नोड्स के आधार पर हैशकोड उत्पन्न करने की आवश्यकता है, उदा।औसत प्रोग्रामर के लिए "अच्छा पर्याप्त" हैश फ़ंक्शन है?
hashCode = function(child1.hashCode, child2.hashCode, ...)
hashCodes उत्तरों की एक recent discussion में तार के लिए एक हैश और भी bitshifting (एक लंबे प्रधानमंत्री और 31 के आधार पर) शामिल थे। स्ट्रिंग हैश है:
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
मुझे सुरक्षा में रूचि नहीं है और टकराव नहीं है। क्या आदेशित वस्तुओं के हैशकोड के संयोजन के लिए एक "सार्वभौमिक कार्य" है जो नुकसान से अधिक अच्छा होगा (और इसे बिल्कुल कॉल करने से ज्यादा अच्छा नहीं)?
क्या ऐसी साइट भी है जहां हम आम मामलों को देख सकते हैं? तार, सूचियां, आदि)
मैंने एक भाषा निर्दिष्ट नहीं की क्योंकि मुझे उम्मीद थी कि सार्वभौमिक दृष्टिकोण थे। लेकिन अगर यह गंभीरता से भाषा-विशिष्ट है तो कृपया भाषा को इंगित करें और यह सार्वभौमिक क्यों नहीं है।
अद्यतन आईडीई के हैशकोड जनरेटर का उपयोग करने के लिए दो सुझाव हैं। यह एक उत्कृष्ट डिफ़ॉल्ट लगता है; यहाँ Netbeans है:
public int hashCode() {
int hash = 5;
// objects
hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : 0);
hash = 97 * hash + (this.tableElement != null ? this.tableElement.hashCode() : 0);
// a string
hash = 97 * hash + (this.tag != null ? this.tag.hashCode() : 0);
return hash;
}
यह वही दिखता है जो मैं चाहता था। कॉमन्स से उद्धरण के लिए: "यह वर्ग किसी भी वर्ग के लिए एक अच्छी हैशकोड विधि बनाने के लिए सक्षम बनाता है। यह जोशुआ ब्लोच द्वारा प्रभावशाली जावा पुस्तक में निर्धारित नियमों का पालन करता है। एक अच्छी हैशकोड विधि लिखना वास्तव में काफी मुश्किल है। इस वर्ग का लक्ष्य है प्रक्रिया को सरल बनाएं। " मुझे संदेह है कि यह मुझे एक बेहतर व्यक्ति बना देगा (हालांकि मुझे लेखकों के नैतिक अधिकारों की परवाह है) लेकिन मुझे उम्मीद है कि यह मुझे एक बेहतर प्रोग्रामर बना देगा ... –
ब्लोच के दृष्टिकोण के बाद से स्वीकार किया गया है जो मैं ढूंढ रहा था –
दुर्भाग्य से वे लिंक अब मर चुके हैं। :( – Skrylar