2012-06-18 14 views
6

मैं इस तरह एक वर्ग निर्माता है:बाइटबफर हैंश कोड क्यों हैं?

public JavoImageCorrectedDataHeader() 
    { 
     ByteBuffer buffer = ByteBuffer.allocate(this.size()); 
     buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); 
     setByteBuffer(buffer, 0); 
     System.out.println("buffer.hasCode=" + buffer.hashCode()); 
    } 

मेरी अन्य वर्गों में, मैं

new JavoImageCorrectedDataHeader() 

तो का उपयोग करके अलग-अलग स्थानों और समय में ऊपर वर्ग के कई उदाहरण बनाने के लिए, मैं उम्मीद यह प्रिंट होगा उनके लिए अलग हैशकोड बाहर। लेकिन मैं वास्तव में देखने के लिए एक ही hashCode प्रिंट आउट है:

buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 

मैं कैसे ByteBuffer का उपयोग करने के बारे में कुछ याद आती है चाहिए।

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#hashCode() - 'ByteBuffer.hashCode' बफर में शेष सामग्री पर निर्भर है। – Erik

+0

भले ही दो ऑब्जेक्ट्स में 'हैशकोड' समान है, जो कि उनकी समानता या समानता के बारे में कुछ भी नहीं है। –

+0

@Erik कृपया जावा 6 या 7 के बजाय पुरानी प्रलेखन का संदर्भ न दें। यह [बाइटबफर] का वास्तविक दस्तावेज है (http://docs.oracle.com/javase/6/docs/api/java/nio/ ByteBuffer.html) –

उत्तर

10

जावाडोक से:

एक बाइट बफर के हैश कोड अपनी शेष तत्वों पर केवल निर्भर करता है; यानी, स्थिति() तक, और सहित तत्वों पर, सीमा पर तत्व() - 1.

क्योंकि बफर हैश कोड सामग्री-निर्भर हैं, इसलिए हैश मानचित्रों में कुंजी के रूप में बफर का उपयोग करना अवांछनीय है या समान डेटा संरचनाएं जब तक कि यह ज्ञात न हो कि उनकी सामग्री बदलेगी नहीं।

आप ByteBuffers पॉप्युलेट नहीं कर रहे हैं, या उन्हें एक ही चीजों के साथ पॉप्युलेट कर रहे हैं, हैश कोड समान होगा।

2

ByteBuffer.hashcode आपको लपेटा बाइट [] के हैश की गणना करने देता है। इस मामले में, प्रत्येक बाइट के लिए नए प्रारंभिक बाइट [] 0 की सामग्री 0 है। यह देखते हुए कि बाइटबफर सामग्री समान है, हैशकोड समान है।

5

ByteBuffer.java स्रोत कोड से:

public int hashCode() { 
    int hashCode = get(position()) + 31; 
    int multiplier = 1; 
    for (int i = position() + 1; i < limit(); ++i) { 
     multiplier *= 31; 
     hashCode += (get(i) + 30)*multiplier; 
    } 
    return hashCode; 
} 

अपने वर्तमान कार्यान्वयन के तहत, position() हमेशा 0 देता है और इस तरह, hashcodes हमेशा समान हैं। हैशकोड बफर की सामग्री पर निर्भर है, भौतिक वस्तु पर नहीं जो इसका प्रतिनिधित्व करने के लिए उपयोग किया जाता है।

3

यह सही व्यवहार है। प्रति ByteBuffer प्रलेखन:

दो बाइट बफ़र्स केवल तभी करता है, तो बराबर है, और कर रहे हैं,

वे एक ही तत्व प्रकार है,

वे शेष तत्वों की एक ही नंबर है, और

शेष तत्वों के दो अनुक्रम, जिन्हें उनकी शुरुआती स्थितियों से स्वतंत्र रूप से माना जाता है, बिंदुत्मक बराबर हैं।

एक बाइट बफर किसी अन्य प्रकार के ऑब्जेक्ट के बराबर नहीं है।

तो, यह मानते हुए कि यह.size() हमेशा एक ही चीज़ देता है, तो आपके बफर हमेशा बराबर होते हैं। हैशकोड के सामान्य अनुबंध के अनुसार, उनके पास सभी एक ही हैश कोड होना चाहिए।

आप वस्तु पहचान निर्धारित करने के लिए हैशकोड का उपयोग करने की कोशिश कर रहे हैं - यह एक अच्छा विचार नहीं है (हैशकोड और == इंटरैक्ट कैसे है)। यदि आपको एक दूसरे से अपनी कक्षा के उदाहरणों को अलग करने की आवश्यकता है, और == ऑपरेटर आपको जो कुछ देता है उससे अधिक की आवश्यकता है, तो आपको इसे करने का कोई और तरीका ढूंढना होगा।

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