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.

7voto

Jon Skeet Punkte 1325502

Wikipedia drückt es gut aus:

Prüfsummenfunktionen sind verwandt mit Hash Hash-Funktionen, Fingerabdrücken, Randomisierungs Zufallsfunktionen und kryptographischen Hash Funktionen. Allerdings hat jedes dieser Konzepte haben jedoch unterschiedliche Anwendungen und daher unterschiedliche Entwurfsziele. Prüfziffern und Paritätsbits sind Spezialfälle von Prüfsummen, geeignet für kleine Datenblöcke (wie z. B. Sozialversicherungsnummern, Bankdaten Kontonummern, Computerwörter, einzelne Bytes, usw.). Einige Fehlerkorrekturcodes beruhen auf speziellen Prüfsummen, die nicht nur häufige Fehler erkennen, sondern auch die Originaldaten in bestimmten Fällen wieder bestimmten Fällen wiederhergestellt werden können.

35 Stimmen

Nachdem ich das gelesen habe, frage ich mich immer noch, worin der Unterschied besteht.

0 Stimmen

@kirk.burleson - Ich würde sagen, dass es sich um dasselbe handelt. Prinzip aber in der Praxis macht man immer Abwägungen . In verschiedenen Situationen gibt es unterschiedliche Kompromisse, so dass unterschiedliche Ansätze verwendet werden. Das ist nicht wirklich eine Rechtfertigung dafür, dass es zwei verschiedene Begriffe gibt, ich will damit nur sagen, dass man bei der Suche nach guten Techniken für Prüfsummen möglicherweise eine andere Reihe von Algorithmen findet als bei der Suche nach Hash-Codes.

6voto

user3464863 Punkte 51

Eine Prüfsumme schützt vor versehentlichen Änderungen.

Ein kryptografischer Hash schützt vor einem sehr motivierten Angreifer.

Wenn Sie Bits über die Leitung senden, kann es passieren, dass einige Bits versehentlich vertauscht, gelöscht oder eingefügt werden. Damit der Empfänger solche Unfälle erkennen (oder manchmal korrigieren) kann, verwendet der Sender eine Prüfsumme.

Wenn man aber davon ausgeht, dass jemand aktiv und intelligent die Nachricht auf der Leitung verändert und man sich gegen diese Art von Angreifern schützen will, dann sollte man einen kryptografischen Hash verwenden (ich ignoriere die kryptografische Signierung des Hashes oder die Verwendung eines zweiten Kanals oder ähnliches, da die Frage darauf nicht hinauszulaufen scheint).

3 Stimmen

"kryptographischer Hash" erhöht die Verwirrung zwischen "Hash" und "Prüfsumme". "kryptografische Prüfsumme" ist besser, weil sie das nicht tut.

5voto

Sascha Wedler Punkte 375

Der Unterschied zwischen Hash-Code- und Prüfsummenfunktionen besteht darin, dass sie für unterschiedliche Zwecke entwickelt wurden.

  • Eine Prüfsumme wird verwendet, um herauszufinden wenn etwas an der Eingabe geändert hat.

  • Ein Hash-Code wird verwendet, um herauszufinden wenn etwas an der Eingabe geändert hat und so viel "Abstand" zwischen den einzelnen Hash-Code-Werten wie möglich zu haben.

    Außerdem gibt es pourrait Weitere Anforderungen an eine Hash-Funktion, die im Gegensatz zu dieser Regel stehen, sind die Fähigkeit, frühzeitig Bäume/Cluster/Buckets von Hash-Code-Werten zu bilden.

    Wenn man dann noch eine gemeinsame anfängliche Randomisierung hinzufügt, erhält man das Konzept für moderne Verschlüsselung/Schlüsselaustausch.


Über Wahrscheinlichkeiten:

Nehmen wir zum Beispiel an, dass sich die Eingabedaten tatsächlich immer ändern (100 % der Zeit). Und nehmen wir an, Sie haben eine "perfekte" Hash-/Prüfsummenfunktion, die einen 1-Bit-Hash-/Prüfsummenwert erzeugt. Daher erhalten Sie für zufällige Eingabedaten in 50 % der Fälle unterschiedliche Hash-/Prüfsummenwerte.

  • Wenn sich genau 1 Bit in Ihren zufälligen Eingabedaten geändert hat, können Sie dies in 100 % der Fälle erkennen, unabhängig davon, wie groß die Eingabedaten sind.

  • Wenn sich 2 Bits in Ihren zufälligen Eingabedaten geändert haben, ist die Wahrscheinlichkeit, eine "Änderung" zu erkennen, durch 2 geteilt, da sich beide Änderungen gegenseitig neutralisieren könnten und keine Hash-/Prüfsummenfunktion erkennen würde, dass sich 2 Bits in den Eingabedaten tatsächlich unterscheiden.

    ...

Das heißt, wenn die Anzahl der Bits in Ihren Eingabedaten um ein Vielfaches größer ist als die Anzahl der Bits in Ihrem Hash-/Prüfsummenwert, verringert sich die Wahrscheinlichkeit, dass Sie tatsächlich unterschiedliche Hash-/Prüfsummenwerte für unterschiedliche Eingabewerte erhalten, und ist keine Konstante .

4voto

Steven Robbins Punkte 26083

Heutzutage sind sie austauschbar, aber früher war eine Prüfsumme eine sehr einfache Technik, bei der man alle Daten zusammenzählt (normalerweise in Bytes) und am Ende ein Byte mit diesem Wert anhängt. Dann weiß man hoffentlich, ob die Originaldaten beschädigt wurden. Ähnlich wie ein Prüfbit, aber mit Bytes.

2voto

Ian1971 Punkte 3636

Ich neige dazu, das Wort Prüfsumme zu verwenden, wenn ich mich auf den Code (numerisch oder anderweitig) beziehe, der für eine Datei oder ein Datenelement erstellt wird und der verwendet werden kann, um siehe dass die Datei oder die Daten nicht beschädigt wurden. Die häufigste Anwendung, die mir begegnet ist, besteht darin, zu überprüfen, ob die über das Netz gesendeten Dateien nicht (absichtlich oder auf andere Weise) verändert wurden.

1 Stimmen

Da Prüfsummen nicht darauf ausgelegt sind, schwer rückgängig gemacht werden zu können, sind sie nicht dazu geeignet, zu überprüfen, ob etwas absichtlich verändert wurde.

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