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.

92voto

Zach Scrivena Punkte 28381

Ich würde sagen, dass ein Prüfsumme ist notwendigerweise a Hashcode . Allerdings ergeben nicht alle Hashcodes gute Prüfsummen.

Eine Prüfsumme hat einen besonderen Zweck --- sie verifiziert oder prüft die Integrität der Daten (einige können darüber hinausgehen, indem sie Folgendes zulassen Fehlerkorrektur ). "Gute" Prüfsummen sind leicht zu berechnen und können viele Arten von Datenfehlern erkennen (z. B. ein, zwei, drei fehlerhafte Bits).

Ein Hashcode beschreibt einfach eine mathematische Funktion die Daten auf einen Wert abbildet. Bei der Verwendung als Mittel zur Indizierung in Datenstrukturen (z. B. einer Hashtabelle) ist eine geringe Kollisionswahrscheinlichkeit wünschenswert.

7 Stimmen

Vielleicht könnte das eine als das andere verwendet werden, aber wenn man bedenkt, dass sie unterschiedliche Ziele verfolgen, verwirrt das nur die Sache.

8 Stimmen

@gumbo: Nein, nicht jeder Hashcode ist eine Prüfsumme. Siehe String-Beispiel von MSalters unten.

46voto

Rafał Dowgird Punkte 40450

Hinter jedem von ihnen steht ein anderer Zweck:

  • Hash-Code - entworfen, um in seinem Bereich zufällig zu sein (um Kollisionen in Hash-Tabellen usw. zu minimieren). Kryptografische Hash-Codes sind außerdem so konzipiert, dass sie rechnerisch nicht umkehrbar sind.
  • Prüfsumme - entwickelt, um die häufigsten Fehler in den Daten zu erkennen und oft schnell zu berechnen (für eine effektive Prüfsummenbildung bei schnellen Datenströmen).

In der Praxis sind dieselben Funktionen oft für beide Zwecke geeignet. Insbesondere ist ein kryptographisch starker Hash-Code eine gute Prüfsumme (es ist fast unmöglich, dass ein zufälliger Fehler eine starke Hash-Funktion bricht), wenn man sich die Rechenkosten leisten kann.

1 Stimmen

Es ist auch gut zu erwähnen, dass die nicht kryptografische Version von Hash-Codes einen guten Kompromiss zwischen Rechenzeit (ähnlich wie CRC) und Fehlererkennung bieten kann, unabhängig davon, ob es sich um einen absichtlichen Fehler oder nur um einen Kommunikationsfehler/Bit-Verfälschung handelt (von CRC kann nicht erwartet werden, dass es absichtliche Manipulationen erkennt, da es relativ einfach ist, absichtlich eine Kollision zu erzeugen).

2 Stimmen

Für mich ist der Schlüsselsatz in Ihrer Antwort, dass die Prüfsumme entwickelt, um die häufigsten Fehler zu erkennen . Ja, das ist es. Es ist ein Hash-Algorithmus, der so gewählt wurde, dass er unterschiedliche Werte für wahrscheinlich Verfälschungen der Daten. Das ist ein spezifischer Zweck und führt zu spezifischen Algorithmen, die dafür optimiert sind - je nach den Arten von Störungen, um die man sich kümmert.

0 Stimmen

Eine funktionale Prüfsumme kann in ihrem gesamten Bereich viele Kollisionen aufweisen, solange es unwahrscheinlich ist, dass die Fehler, auf die Sie prüfen, zu solchen Kollisionen führen. Es könnte zum Beispiel eine gewisse Periodizität in der Prüfsumme vorhanden sein, die Ihnen egal ist, weil Fehler Sie nie dorthin führen. (Ein gutes Beispiel ist die Parität, die nur vor Ein-Bit-Fehlern schützt.) Die Definition einer guten Prüfsumme hängt also von dem Fehlermodell ab.

26voto

Michael Borgwardt Punkte 334642

Es gibt in der Tat einige Unterschiede:

  • Prüfsummen müssen nur dann unterschiedlich sein, wenn die Eingabe unterschiedlich ist (so oft wie möglich), aber es ist fast genauso wichtig, dass sie schnell zu berechnen sind.
  • Für Hash-Codes (zur Verwendung in Hashtabellen) gelten dieselben Anforderungen, und zusätzlich sollten sie gleichmäßig über den Coderaum verteilt sein, insbesondere bei gleichartigen Eingaben.
  • Kryptographische Hashes haben die viel die strengere Anforderung, dass man bei einem Hash nicht eine Eingabe konstruieren kann, die diesen Hash ergibt. Die Berechnungszeit kommt an zweiter Stelle, und je nach Anwendung kann es sogar wünschenswert sein, dass der Hash sehr langsam berechnet wird (um Brute-Force-Angriffe zu bekämpfen).

1 Stimmen

Ich glaube nicht, dass unterschiedliche Prüfsummen für verschiedene Eingaben irgendwelche Vorteile haben. Sie dienen nur zur Überprüfung der Integrität, nicht zum Hashing.

1 Stimmen

@Mehrdad: Wie schlagen Sie also vor, die Integrität zu überprüfen, ohne unterschiedliche Ergebnisse für verschiedene Eingaben zu erhalten?

0 Stimmen

Äh, vielleicht habe ich mich falsch ausgedrückt? Ich bezog mich auf den Teil, in dem Sie sagten "so weit wie möglich" - ich sage nur, dass es keinen Grund gibt, warum sie unvorhersehbar oder "weit" sein sollten, wie Hashes es sind. Solange es eine einige Wenn sich die Prüfsumme nicht ändert, wenn die Eingabe eine typische Änderung erfährt, ist es eine gute Prüfsumme. Vergleichen Sie das mit Hashes, die ebenfalls das Ziel haben, die Dinge so gleichmäßig/zufällig/unvorhersehbar/"weit" wie möglich auf ihre Codomäne zu verteilen.

19voto

MSalters Punkte 166675

Hashcodes und Prüfsummen werden beide verwendet, um kurze numerische Werte aus einem Datenelement zu erstellen. Der Unterschied besteht darin, dass sich ein Prüfsummenwert auch dann ändern sollte, wenn nur eine kleine Änderung an den Daten vorgenommen wird. Bei einem Hashwert besteht die Anforderung lediglich darin, dass Datenelemente der realen Welt eindeutige Hashwerte haben sollten.

Ein eindeutiges Beispiel sind Zeichenketten. Eine Prüfsumme für eine Zeichenkette sollte jedes einzelne Bit enthalten, und die Reihenfolge ist wichtig. Ein Hashcode hingegen kann oft als Prüfsumme eines Präfixes begrenzter Länge implementiert werden. Das würde bedeuten, dass "aaaaaaaaaaaaba" dasselbe wie "aaaaaaaaaaaaab" wäre, aber Hash-Algorithmen können mit solchen Kollisionen umgehen.

1 Stimmen

Diese Antwort ist diejenige, bei der es bei mir klingelt. Die Datenintegrität ist also nicht der Schwerpunkt eines Hashes.

10voto

N Randhawa Punkte 7493

Obwohl Hashing und Prüfsummen insofern ähnlich sind, als sie beide einen Wert auf der Grundlage des Inhalts einer Datei erstellen, ist Hashing nicht dasselbe wie Erstellen einer Prüfsumme. Eine Prüfsumme soll die Integrität von Daten verifizieren (prüfen) Integrität von Daten zu überprüfen und Datenübertragungsfehler zu erkennen, während ein Hash dazu dient, einen eindeutigen digitalen Fingerabdruck der Daten zu erstellen.

Quelle: CompTIA ® Security+ Guide to Network Security Fundamentals - Fifth Edition - Mark Ciampa - Seite 191

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