Ich sehe oft Code wieWarum wird XOR oft in Java hashCode() verwendet, aber andere bitweise Operatoren werden selten verwendet?
int hashCode(){
return a^b;
}
XOR Warum?
Ich sehe oft Code wieWarum wird XOR oft in Java hashCode() verwendet, aber andere bitweise Operatoren werden selten verwendet?
int hashCode(){
return a^b;
}
XOR Warum?
Von allen Bit-Operationen hat XOR die besten Bit-Shuffling-Eigenschaften.
Diese Wahrheitstabelle erklärt, warum:
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
Wie Sie für AND und OR tun einen schlechten Job bei Misch Bits sehen können.
OR wird im Durchschnitt 3/4 Ein-Bits produzieren. UND auf der anderen Seite wird im Durchschnitt 3/4-Null-Bits erzeugen. Nur XOR hat eine geradzahlige Ein-Bit- oder Null-Bit-Verteilung. Das macht es für die Hash-Code-Generierung so wertvoll.
Denken Sie daran, dass Sie für einen Hash-Code möglichst viele Informationen des Schlüssels verwenden und eine gute Verteilung der Hash-Werte erhalten möchten. Wenn Sie AND oder OR verwenden, erhalten Sie Zahlen, die auf Zahlen mit vielen Nullen oder Zahlen mit vielen Einsen ausgerichtet sind.
+1 Das ist sehr informativ ..... – Bhaskar
XOR opertpr reversibel sind, also nehme ich an einen Bitstring als 0 0 1
und ich XOR es mit einem anderen Bitstring 1 1 1
, die die Ausgabe
0 xor 1 = 1
0 1 = 1
1 1 = 0
jetzt i xor die erste Saite mit dem Ergebnis Agan kann um die 2. Saite zu bekommen. d. h.
also, das macht die 2. Zeichenkette zu einem Schlüssel. Dieses Verhalten ist nicht mit anderen Bitoperator
Bitte lesen Sie diese für weitere Informationen gefunden ->Why is XOR used on Cryptography?
hashCode muss nicht invertiert werden. // Sorry für meine schlechte Englisch –
ja, aber eine Verwendung von XOR in der Kryptographie ist seine Reversibilität Natur. – Bhaskar
XOR hat folgende Vorteile:
Weitere Informationen here.
Eine XOR-Operation verschwendet keine Bits * wenn * alle Eingangsbits unabhängig sind, aber wenn sie Bits zusammenführt, die stark korreliert sind, kann dies viel verschwenden. Wenn zum Beispiel ein Typ ein Paar von Zahlen im Bereich 0-65535 darstellt und einen Hash bildet, indem die Zahlen zusammen xoriert werden, sind die oberen 16 Bits, die in jedem Wert Null sind, in dem Hash-Code Null. Schlimmer noch, wenn bei einer unverhältnismäßigen Anzahl von Instanzen (z. B. 10%) beide Nummern übereinstimmen, wird derselbe Anteil der Instanzen Null für den Hash zurückgeben. – supercat
Es gibt einen weiteren Anwendungsfall: Objekte , in denen (einige) Felder verglichen werden müssen, ohne ihre Reihenfolge zu berücksichtigen. Zum Beispiel, wenn Sie ein Paar (a, b)
immer gleich dem Paar sein wollen.
XOR hat die Eigenschaft a^b
= b^a
, so dass es in solchen Fällen in der Hash-Funktion verwendet werden kann.
Beispiele: (vollständige Code here)
Definition:
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
}
Nutzung:
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}
Mögliche Duplizieren -> http://stackoverflow.com/questions/1379952/why -is-xor-used-on-cryptography – Bhaskar