Vedo spesso il codice comePerché XOR viene spesso utilizzato in java hashCode() ma altri operatori bit a bit vengono usati raramente?
int hashCode(){
return a^b;
}
Perché XOR?
Vedo spesso il codice comePerché XOR viene spesso utilizzato in java hashCode() ma altri operatori bit a bit vengono usati raramente?
int hashCode(){
return a^b;
}
Perché XOR?
Di tutte le operazioni di bit XOR ha le migliori proprietà di shuffling dei bit.
Questa verità-tabella spiega perché:
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
Come si può vedere di AND e OR fare un lavoro poveri a bit di miscelazione.
OR produrrà in media 3/4 di un bit. E d'altra parte produrrà in media 3/4 null-bit. Solo XOR ha una distribuzione anche un bit contro un bit nullo. Ciò lo rende così prezioso per la generazione di codice hash.
Ricordare che per un codice hash si desidera utilizzare quante più informazioni possibili della chiave e ottenere una buona distribuzione dei valori hash. Se usi AND o OR otterrai numeri che sono prevenuti verso entrambi i numeri con molti zeri o numeri con molti di quelli.
+1 Questo è molto informativo ..... – Bhaskar
XOR opertpr sono reversibili, cioè supponiamo di avere una stringa di bit come 0 0 1
e XOR con un'altra stringa di bit 1 1 1
, l'uscita è
0 xor 1 = 1
0 1 = 1
1 1 = 0
ora posso AGAN xor la 1a corda con il risultato per ottenere la seconda corda. Ad esempio
0 1 = 1
0 1 = 1
1 0 = 1
quindi, che rende la seconda stringa una chiave. Questo comportamento non è stato trovato con operatore altro po
Si prega di vedere questo per ulteriori informazioni ->Why is XOR used on Cryptography?
hashCode non ha bisogno di essere invertito. // Mi spiace per il mio cattivo inglese –
sì, ma un uso di XOR in crittografia è la sua natura di reversibilità. – Bhaskar
XOR presenta i seguenti vantaggi:
Ulteriori informazioni here.
Un'operazione xor non spreca bit * se * tutti i bit di input sono indipendenti, ma se unisce bit fortemente correlati può sprecare molto. Ad esempio, se uno ha un tipo che rappresenta una coppia di numeri nell'intervallo 0-65535 e forma un hash facendo xorare insieme i numeri, i 16 bit superiori che sono zero in ogni valore saranno zero nel codice hash. Peggio ancora, se un numero sproporzionato di istanze (ad es. 10%) corrisponde a entrambi i numeri, la stessa proporzione di istanze restituirà zero per l'hash. – supercat
C'è un altro caso d'uso: oggetti in cui (alcuni) campi devono essere confrontati senza riguardo al loro ordine. Ad esempio, se si desidera una coppia (a, b)
essere sempre uguale alla coppia (b, a)
.
XOR ha la proprietà che a^b
= b^a
, quindi può essere utilizzato in funzione hash in questi casi.
Esempi: (codice completo here)
definizione:
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
}
utilizzo:
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}
Eventuali duplicati -> http://stackoverflow.com/questions/1379952/why -is-xor-used-on-cryptography – Bhaskar