142 Stimmen

Hash-Code und Prüfsumme - was ist der Unterschied?

Meines Erachtens sind ein Hash-Code und eine Prüfsumme ähnliche Dinge - ein numerischer Wert, der für einen Datenblock berechnet wird, der relativ einzigartig.

d.h. die Wahrscheinlichkeit, dass zwei Datenblöcke den gleichen numerischen Hash-/Prüfsummenwert ergeben, ist so gering, dass sie für die Zwecke der Anwendung ignoriert werden kann.

Haben wir also zwei Worte für dieselbe Sache, oder gibt es wichtige Unterschiede zwischen Hashcodes und Prüfsummen?

4 Stimmen

Die Antworten werden im Folgenden zusammengefasst: Ein Hash-Code reduziert die Eingabe auf eine kleine Zahl, so dass die Wahrscheinlichkeit von Kollisionen minimiert wird. Eine Prüfsumme hingegen reduziert die Eingabe auf eine kleine Zahl, so dass die Wahrscheinlichkeit von Kollisionen minimiert wird. Sie können das eine vom anderen unterscheiden, indem Sie diese Beschreibung beliebig umformulieren.

4 Stimmen

@DanStahlke - Nein, das ist nicht das, was in den Antworten unten steht. Ja, sie reduzieren beide die Eingabe auf eine kleinere Zahl. Aber es gibt viele, viele Möglichkeiten, dies zu tun. Wie wählt man aus, welchen Algorithmus man verwendet? Das hängt von Ihrem Ziel ab. Um die ersten beiden Antworten zusammenzufassen: Der Ziel einer Prüfsumme ist " um die häufigsten Fehler zu erkennen ". Wählen Sie einen Algorithmus, der eine andere Prüfsumme ergibt, je nachdem, welche Fehler in Ihrem Szenario "am häufigsten" auftreten. Wenn Sie sich Sorgen machen, dass ein oder zwei Bits vertauscht werden, können Sie einen Algorithmus wählen, der garantiert Erkennung dieses spezifischen Fehlers! Dies ist ein sehr spezifischer Kompromiss.

1 Stimmen

@DanStahlke - auf der anderen Seite, Hash-Code deckt ein breites Spektrum an möglichen Kompromissen ab. Wenn wir einen Wert meinen, der bei der Erstellung einer Hashtabelle verwendet wird, wissen wir, dass es wird Kollisionen sein, und zwar jede Menge. Dies ist ein ganz anderer Kompromiss (als eine Prüfsumme). Wir versuchen, Kollisionen zu reduzieren im Durchschnitt . Wir übernehmen keine Garantie für irgendetwas. Es kann Eingaben geben, die sich nur um ein Bit unterscheiden, aber denselben Hash ergeben. Das ist völlig in Ordnung, wenn im Durchschnitt erhalten wir eine gute Verteilung der Hash-Werte. Für eine Prüfsumme wäre dies jedoch inakzeptabel.

0voto

eigenfield Punkte 3121

Beim Redis-Cluster-Datensharing wird eine hash slot um zu entscheiden, an welchen Knoten er geht. Nehmen Sie zum Beispiel die Modulo-Operation unten:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

El 6 wird bei unterschiedlichen Eingaben zweimal angezeigt. Der Zweck des Hashes besteht einfach darin, einen Eingabewert auf einen Ausgabewert abzubilden, und Einzigartigkeit ist nicht Teil des Geschäfts. Zwei verschiedene Eingaben, die dieselbe Ausgabe ergeben, sind in der Welt der Hashes also in Ordnung.

Eine Prüfsumme hingegen muss sich in der Ausgabe unterscheiden, selbst wenn sich ein Bit in der Eingabe ändert, da ihr Zweck nicht in der Abbildung, sondern in der Erkennung von Datenfehlern besteht. Zwei unterschiedliche Eingaben, die dieselbe Ausgabe ergeben, sind für eine Prüfsumme also nicht akzeptabel.

-1voto

yoAlex5 Punkte 20661
  • hash code (Sip Hash) wird normalerweise für Hash-Tabellen-basierte Strukturen (Dictionary, Set, HashMap...) verwendet, bei denen die Grundoperationen eine konstante Zeit haben - O(1)
  • check sum (MD5, SHA) wird verwendet, um die Datenintegrität anzuzeigen.

Der Hauptunterschied besteht darin, dass check sum muss sein einzigartig während hash code kann für verschiedene Objekte gleich sein. Zum Beispiel in Java oder Swift können Sie hash code wird begrenzt durch Int . Normalerweise wird es in Verbindung mit equals Funktion. Zwei verschiedene Objekte können die gleiche hash code .

[Java-Hashcode]

-5voto

Eine Prüfsumme ist einfach eine Zahl, die aus dem Datenfeld durch oring (durch logische Addition, also Summe) erzeugt wird. Die Prüfsumme ist in der Lage, eine Verfälschung eines beliebigen Bits oder einer beliebigen Anzahl von Bits innerhalb des Datenfeldes, aus dem sie generiert wurde, zu erkennen, d. h. sie prüft auf Fehler, kann diese aber nicht korrigieren. Eine Prüfsumme ist ein Hash, weil die Größe der Prüfsumme kleiner ist als die der Originaldaten. Ja, es gibt Kollisionen, weil die Prüfsumme überhaupt nicht auf die Bitposition im Datenfeld reagiert.

Eine zyklische Redundanzprüfung (CRC) ist etwas ganz anderes, komplexer und wird NICHT als Prüfsumme bezeichnet. Es handelt sich um die Anwendung einer Polynomreihe, die in der Lage ist, eine beliebige Anzahl einzelner fehlerhafter Bits innerhalb des Datenfeldes, aus dem sie erzeugt wurde, zu korrigieren. Die Erstellung eines CRC ergibt eine Zahl, die größer ist als das ursprüngliche Datenfeld (im Gegensatz zur Prüfsumme) - daher der Name mit dem Wort "Redundanz" und der Preis, den Sie für die Fehlerkorrekturfähigkeit zahlen. Ein CRC ist daher KEIN Hash und darf nicht mit einer Prüfsumme verwechselt oder als solche bezeichnet werden, da die Redundanz zwangsläufig die Größe der Originaldaten erhöht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X