मैं अक्सर की तरहएक्सओआर अक्सर जावा हैशकोड() में क्यों उपयोग किया जाता है लेकिन एक और बिटवाई ऑपरेटर का शायद ही कभी उपयोग किया जाता है?
int hashCode(){
return a^b;
}
कोड क्यों XOR देखते हैं?
मैं अक्सर की तरहएक्सओआर अक्सर जावा हैशकोड() में क्यों उपयोग किया जाता है लेकिन एक और बिटवाई ऑपरेटर का शायद ही कभी उपयोग किया जाता है?
int hashCode(){
return a^b;
}
कोड क्यों XOR देखते हैं?
सभी बिट-ऑपरेशंस एक्सओआर में सबसे अच्छा शफल गुण है।
यह सच-तालिका बताता है कि क्यों: आप और के लिए
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 का उपयोग करते हैं तो आपको संख्याएं मिलेंगी जो कि संख्याओं की ओर पक्षपातपूर्ण हैं, जिनमें बहुत सारे शून्य या संख्याएं हैं।
+1 यह बहुत जानकारीपूर्ण है ..... – Bhaskar
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?
हैशकोड को उलटा होने की आवश्यकता नहीं है। // मेरी बुरी अंग्रेजी –
हाँ के लिए खेद है, लेकिन क्रिप्टोग्राफी में एक्सओआर का एक उपयोग इसकी रिवर्सिबिलिटी प्रकृति है। – Bhaskar
XOR निम्न लाभ हैं:
अधिक जानकारी here।
एक एक्सर ऑपरेशन बिट्स बर्बाद नहीं करता है * यदि * सभी इनपुट बिट स्वतंत्र हैं, लेकिन यदि यह बिट्स को विलय करता है जो दृढ़ता से सहसंबंधित हैं तो यह बहुत बर्बाद हो सकता है। उदाहरण के लिए, यदि किसी के पास एक प्रकार है जो 0-65535 श्रेणी में संख्याओं की एक जोड़ी का प्रतिनिधित्व करता है और संख्याओं को xor'ing करके हैश बनाता है, तो ऊपरी 16 बिट्स जो प्रत्येक मान में शून्य हैं, हैश कोड में शून्य होगी। इससे भी बदतर, यदि उदाहरणों की असमान संख्या (उदा। 10%) दोनों संख्याएं मेल खाते हैं, तो उदाहरण के समान अनुपात हैश के लिए शून्य लौटाएगा। – supercat
एक अन्य उपयोग केस है: ऑब्जेक्ट्स जिसमें (कुछ) फ़ील्ड की तुलना उनके आदेश के बिना की जानी चाहिए। उदाहरण के लिए, यदि आप एक जोड़ी चाहते हैं (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}
संभव डुप्लिकेट -> http://stackoverflow.com/questions/1379952/why -is-xor-used-on-cryptography – Bhaskar