2012-03-10 19 views
9

में एक डबल हैश मैं जावा में एक डबल हैश करने के बारे में सोच रहा था? मैंने अन्य आदिम डेटा और वस्तुओं को धोया है। मैंने सोचा कि मैं हैशकोड विधि का उपयोग कर सकता हूं? मैंने जो देखा है उससे काफी जटिल दिखता है। मैं बीज बनाने के बारे में कुछ आया।जावा

मैं इस बारे में किसी भी विचार से सोच रहा था कि इस बारे में कैसे जाना है। कक्षा के लिए मेरे हैशकोड के बाकी हिस्सों के साथ डालने की उम्मीद है जिसमें डबल है?

मैं सोच रहा था कि जावा में हैश सरणी, सरणी और अन्य वस्तुओं की कोशिश करने में मेरे साथ कोई समस्या है या नहीं। मेरे कुछ वर्गों में सरणीसूची शामिल हैं।

कई धन्यवाद

उत्तर

20

Double.hashCode() जटिल? यह मूल रूप से double को long में परिवर्तित करता है (यहां कोई जादू नहीं है, इसके बाद वे दोनों स्मृति में केवल 64-बिट मान हैं) और कंप्यूटिंग long हैश काफी सरल है। double ->long रूपांतरण public static doubleToLongBits() के माध्यम से किया जाता है। इसके बारे में जटिल क्या है?

उदाहरण:

Double.valueOf(42.5).hashCode();  //better answer to everything 

Long.valueOf(Double.doubleToLongBits(42.5)).hashCode(); 
+0

हाय टोमाज़ काम किया, मैं डबल पर hashCode की कोशिश की और मिला निम्न संदेश dereferenced नहीं किया जा सकता। मैं हैककोड() विधि को getClassMethod() पर चला रहा हूं i.e this.getClassMethod()। हैशकोड(); GetClassMethod डबल देता है। – daveb

+0

@ डेवब: उदाहरणों पर एक नज़र डालें जो मैंने अभी अपने उत्तर में जोड़ा है। –

+0

धन्यवाद @ थॉमसज़, मैंने int हैश 6 = डबल .valueOf (this.getClassMethod()) हैशकोड(); और यह पिछली समस्या के बिना संकलित। क्या कोड की रेखा आपके लिए ठीक है? चीयर्स डेव बी – daveb

2

क्या आप के लिए यह जरूरत पर निर्भर करता है, तो आप सिर्फ आधुनिक (ing) की एक बहुत ही सरल दृष्टिकोण के साथ जा सकते हैं यह।

int hash(double d) { 
    return d % 71; //use a prime number here 
} 

यदि यह हैश में कुछ युगल स्टोर करने के लिए है, तो इसे करना चाहिए। यदि आप हैश फैलाना चाहते हैं, तो बस "71"

+0

यह एक गरीब हैश है, यह एक-दूसरे के करीब युगल के लिए समान मूल्य वापस कर देगा। और क्या होगा यदि आपके कार्यक्रम को केवल 0 और 1 के बीच युगल की आवश्यकता है? लगातार हैश। –

+0

मैं diff वर्गों के सभी क्षेत्रों को हँस रहा हूं, और हैशकोड ओवरराइड कर रहा हूं, बराबर है और मेरी सभी कक्षाओं के लिए स्ट्रिंग कर रहा हूं। ताकि मैं उनसे वस्तुओं की तुलना कर सकूं और यह भी सुनिश्चित कर सकूं कि वस्तुएं भी अद्वितीय हैं। मैं 31 प्राइम नंबर का उपयोग कर रहा हूं और हैशकोड को 1 में जोड़ रहा हूं। मेरा डबल एक आइटम की कीमत के लिए है। डेव बी – daveb

+1

@ टोमाज़्नुक्यूविच पूरी तरह से सहमत हैं! यही कारण है कि मैंने "इसके लिए आपको क्या चाहिए" के आधार पर शुरू किया। यदि आप "जानते थे" आपके मान 0 और 1 के बीच थे तो आपको कुछ और उपयोग करना चाहिए। – krico

2

जावा को ऐसा करने के लिए एक डबल के कच्चे बिट को लंबे समय तक परिवर्तित करना है।

// from Double. 
public static long doubleToLongBits(double value) { 
    long result = doubleToRawLongBits(value); 
    // Check for NaN based on values of bit fields, maximum 
    // exponent and nonzero significand. 
    if (((result & DoubleConsts.EXP_BIT_MASK) == 
      DoubleConsts.EXP_BIT_MASK) && 
     (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L) 
     result = 0x7ff8000000000000L; 
    return result; 
} 

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

नोट: NaN (और दो प्रकार) के कई मूल्य हैं लेकिन जावा उन्हें सभी के समान व्यवहार करता है।

1

यह एक के लिए मुझे

int h2 = new Double(area).hashCode();