2010-02-25 14 views
41

मैं अक्सर की तरहएक्सओआर अक्सर जावा हैशकोड() में क्यों उपयोग किया जाता है लेकिन एक और बिटवाई ऑपरेटर का शायद ही कभी उपयोग किया जाता है?

int hashCode(){ 
    return a^b; 
} 

कोड क्यों XOR देखते हैं?

+2

संभव डुप्लिकेट -> http://stackoverflow.com/questions/1379952/why -is-xor-used-on-cryptography – Bhaskar

उत्तर

79

सभी बिट-ऑपरेशंस एक्सओआर में सबसे अच्छा शफल गुण है।

यह सच-तालिका बताता है कि क्यों: आप और के लिए

A B AND 
0 0 0 
0 1 0 
1 0 0 
1 1 1 

A B OR 
0 0 0 
0 1 1 
1 0 1 
1 1 1 

A B XOR 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

देख सकते हैं और या मिश्रण बिट्स पर एक गरीब काम कर के रूप में।

या औसत उत्पादन 3/4 एक-बिट्स पर होगा। और दूसरी तरफ औसत 3/4 नल-बिट्स पर उत्पादन होगा। केवल एक्सओआर में एक-बिट बनाम शून्य-बिट वितरण भी है। यह हैश कोड कोड के लिए यह इतना मूल्यवान बनाता है।

याद रखें कि हैश कोड के लिए आप जितनी संभव हो सके कुंजी की अधिक जानकारी का उपयोग करना चाहते हैं और हैश-मानों का एक अच्छा वितरण प्राप्त करना चाहते हैं। यदि आप AND या OR का उपयोग करते हैं तो आपको संख्याएं मिलेंगी जो कि संख्याओं की ओर पक्षपातपूर्ण हैं, जिनमें बहुत सारे शून्य या संख्याएं हैं।

+5

+1 यह बहुत जानकारीपूर्ण है ..... – Bhaskar

4

XOR opertpr पूर्ववत किया जा सकता, यानी मैं 0 0 1 के रूप में एक बिट श्रृंखला है लगता है और मैं एक बिट श्रृंखला के 1 1 1 साथ यह XOR, उत्पादन

0 xor 1 = 1 
0  1 = 1 
1  1 = 0 

अब मैं XOR परिणाम के साथ 1 स्ट्रिंग Agan कर सकते हैं दूसरी स्ट्रिंग पाने के लिए। यानी

0 1 = 1 
0 1 = 1 
1 0 = 1 

इसलिए, यह दूसरी स्ट्रिंग को एक कुंजी बनाता है। यह व्यवहार अन्य बिट ऑपरेटर नहीं पाई जाती है

अधिक जानकारी के लिए यह देखने ->Why is XOR used on Cryptography?

+3

हैशकोड को उलटा होने की आवश्यकता नहीं है। // मेरी बुरी अंग्रेजी –

+0

हाँ के लिए खेद है, लेकिन क्रिप्टोग्राफी में एक्सओआर का एक उपयोग इसकी रिवर्सिबिलिटी प्रकृति है। – Bhaskar

15

XOR निम्न लाभ हैं:

  • यह निर्भर नहीं करता गणना यानी एक के आदेश पर^बी = बी^एक
  • यह बिट्स को "बर्बाद" नहीं करता है। यदि आप घटकों में से एक में भी एक बिट बदलते हैं, तो अंतिम मान बदल जाएगा।
  • यह त्वरित है, यहां तक ​​कि सबसे प्राचीन कंप्यूटर पर एक चक्र भी है।
  • यह समान वितरण को संरक्षित करता है। यदि आपके द्वारा एकत्र किए गए दो टुकड़े समान रूप से वितरित होते हैं तो संयोजन होगा। दूसरे शब्दों में, यह पाचन की सीमा को एक संकुचित बैंड में पतन नहीं करता है।

अधिक जानकारी here

+1

एक एक्सर ऑपरेशन बिट्स बर्बाद नहीं करता है * यदि * सभी इनपुट बिट स्वतंत्र हैं, लेकिन यदि यह बिट्स को विलय करता है जो दृढ़ता से सहसंबंधित हैं तो यह बहुत बर्बाद हो सकता है। उदाहरण के लिए, यदि किसी के पास एक प्रकार है जो 0-65535 श्रेणी में संख्याओं की एक जोड़ी का प्रतिनिधित्व करता है और संख्याओं को xor'ing करके हैश बनाता है, तो ऊपरी 16 बिट्स जो प्रत्येक मान में शून्य हैं, हैश कोड में शून्य होगी। इससे भी बदतर, यदि उदाहरणों की असमान संख्या (उदा। 10%) दोनों संख्याएं मेल खाते हैं, तो उदाहरण के समान अनुपात हैश के लिए शून्य लौटाएगा। – supercat

1

एक अन्य उपयोग केस है: ऑब्जेक्ट्स जिसमें (कुछ) फ़ील्ड की तुलना उनके आदेश के बिना की जानी चाहिए। उदाहरण के लिए, यदि आप एक जोड़ी चाहते हैं (a, b) हमेशा जोड़ी (b, a) के बराबर रहें।
एक्सओआर की संपत्ति है a^b = b^a, इसलिए इसका उपयोग ऐसे मामलों में हैश फ़ंक्शन में किया जा सकता है।

उदाहरण: (पूर्ण कोड here)

परिभाषा:

final class Connection { 
    public final int A; 
    public final int B; 

    // some code omitted 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Connection that = (Connection) o; 

     return (A == that.A && B == that.B || A == that.B && B == that.A); 
    } 

    @Override 
    public int hashCode() { 
     return A^B; 
    } 

    // some code omitted 
} 

उपयोग:

 HashSet<Connection> s = new HashSet<>(); 
     s.add(new Connection(1, 3)); 
     s.add(new Connection(2, 3)); 
     s.add(new Connection(3, 2)); 
     s.add(new Connection(1, 3)); 
     s.add(new Connection(2, 1)); 

     s.remove(new Connection(1, 2)); 

     for (Connection x : s) { 
      System.out.println(x); 
     } 

     // output: 
     // Connection{A=2, B=3} 
     // Connection{A=1, B=3} 
संबंधित मुद्दे