Ist das der richtige Weg, um eine Prüfsumme zu finden?

8

Ich versuche eine Prüfsumme für einige Daten zu berechnen. Dies ist der Code:

%Vor%

Ausgabe:

%Vor%

Änderung im Code:

%Vor%

Ausgabe:

%Vor%

Warum Änderung des Prüfsummenwerts? Werden verschiedene Algorithmen unterschiedliche Prüfsummen bereitstellen?

Wie wird der Endwert nützlich sein? Nun, eigentlich bin ich mir nicht sicher über die Prüfsumme und ihre Verwendung bei der Datenvalidierung. Ich suchte im Internet, fand viele Artikel, aber immer noch nicht klar. Hoffe, ich werde heute über Checksum hier verstehen.

    
highlander141 25.12.2015, 06:19
quelle

3 Antworten

3

Das ist die Schönheit des Prüfsummenalgorithmus: dass die Art und Weise, wie Sie die Prüfsumme und die Art der Überprüfung erzeugen, irgendwie symmetrisch ist!

  1. Über Prüfsumme

Checksum wird typischerweise verwendet, um die Integrität der Daten zu überprüfen, insbesondere über einen verrauschten / unrealistischen Kommunikationskanal. Daher wird es hauptsächlich für die Fehlererkennung verwendet. Das heißt, zu wissen, ob die empfangenen Daten korrekt oder nicht sind.

Dies ist z. B. bei Fehlerkorrektur anders. Da die Verwendung nicht ist, nur um zu prüfen, ob ein Fehler vorliegt, aber auch, um ihn zu korrigieren, wächst in der Regel proportional > mit seinen ursprünglichen Daten (je mehr Daten Sie haben, desto mehr Overhead benötigen Sie, um sie wiederherzustellen).

In diesem Sinne ist ein guter Prüfsummenalgorithmus in der Regel einer, der die kleinste Menge an Overhead-Daten verwendet, um den Fehler zu erkennen, aber mit große Robustheit gegenüber falschem Ergebnis.

Und mit diesem Verständnis liegt das Problem, da die Robustheit der Prüfsumme nicht nur vom Algorithmus abhängt, sondern auch von den channel Eigenschaften. Einige Kanäle können zu bestimmten Fehlertypen neigen, während andere Kanäle andere Kanäle verwenden. Im Allgemeinen gibt es einige Prüfsummen, die bekanntermaßen robuster und beliebter sind als die anderen (einer meiner Favoriten ist CRC - Cyclic Redundancy Check ). Aber es gibt keine perfekte Prüfsumme für jedes Szenario, es hängt wirklich von der Verwendung und dem Szenario ab.

Aber Sie können dennoch Robustheit eines Prüfsummenalgorithmus messen. Und es gibt einen mathematischen Weg, dies zu tun, was meiner Meinung nach den Rahmen dieser Diskussion sprengen würde. Somit können einige Prüfsummen in diesem Sinne als schwächer als die anderen bezeichnet werden. Prüfsummen, die Sie in Ihrer Frage gezeigt haben, sind auch die Schwachen.

  1. Über den Code

XOR mit 0xFF für 8-Bit ist vollkommen gleichwertig mit binär-invertieren eines Wertes, und es ist nicht zu schwer, es zu sehen.

XOR mit 0xFF

%Vor%

Wenn Sie also XOR mit 0xFF und ~checksum ausführen, erhalten Sie dasselbe Ergebnis -71 (und da Ihr Datentyp char ist, hat es eine negative Zahl). Dann erhöhst du es um 1, also bekommst du -70.

  1. Über 2 'Ergänzung
  

Zweierkomplement ist eine mathematische Operation für Binärzahlen sowie eine binär vorzeichenbehaftete Zahlendarstellung basierend auf dieser Operation. Seine breite Verwendung in der Computertechnik macht es zum wichtigsten Beispiel für eine Radix-Ergänzung. ( wikipedia )

Mit anderen Worten, 2 'Komplement soll die negative Repräsentation eines Wertes finden (in Computer Binary) und seine Methode ist, wie Sie es richtig gemacht haben, indem Sie alle seine Bits invertieren und dann eins hinzufügen. Deshalb bekommt man -70 durch 2 . Aber das bedeutet nicht , dass 2 'Komplement und XOR durch 0xFF ist das gleiche , und wie Sie am Beispiel sehen können, ist es wirklich nicht das Gleiche.

Was XOR by 0xFF in 8-Bit-Daten tut, ist einfach äquivalent zur Umkehrung aller seiner Bits. Es fügt keine hinzu .

  1. Über die Art und Weise, die Prüfsumme zu lesen / lesen

Da die Prüfsumme verwendet wird, um die Integrität der Daten zu kennen (ob sie geändert wird oder nicht), versuchen die Leute, die beste Vorgehensweise dafür zu finden. Was Sie tun, ist eigentlich, die Prüfsumme um 2 'Komplement oder durch XOR mit 0xFF zu bekommen.

Und das tun sie:

  • Für 2 'Komplement Prüfsumme. Nehmen wir an, Ihre Nachrichtenlänge ist N. Seit dem, was Sie durch Summierung von N Zahlen erhalten, sagen wir, 70. Dann durch Hinzufügen von 2'Complement Prüfsumme (das ist -70), Auf der Empfängerseite müssen Sie einfach summiere alle N + 1 Nachrichten einschließlich der Prüfsumme und du solltest 0 erhalten, wenn die Nachricht unverändert ist . So verwenden Sie die 2 'Komplement-Prüfsumme korrekt.
  • Für XOR mit 0xFF Wiederum, mit dem gleichen Beispiel wie zuvor, sollten Sie -1 erhalten, wenn Sie alle N + 1 Nachrichten, einschließlich der Prüfsumme, zusammenfassen. Und da die hexadezimale Darstellung von -1 0xFF in 8-Bit-Vorzeichen ist, also durch XOR-Verknüpfung des Ergebnisses (-1) mit 0xFF, sollten Sie 0xFF ^ 0xFF = 0 erhalten, wenn die Nachricht keinen Fehler enthält

Daher müssen Sie in beiden Fällen einfach prüfen, ob die Nachricht einen Fehler enthält oder nicht, indem Sie prüfen, ob das Endergebnis 0 ist (kein Fehler) oder nicht !! Dies trifft normalerweise auf die Prüfsumme zu Algorithmen!

Das ist die Schönheit des Prüfsummenalgorithmus: dass die Art und Weise, wie Sie die Prüfsumme und die Art der Überprüfung erzeugen, irgendwie symmetrisch ist!

    
Ian 25.12.2015, 15:05
quelle
7

Sie müssen wissen, was eine Prüfsumme ist, bevor Sie darüber nachdenken, wie Sie diese erzeugen. Nehmen Sie das Problem des Sendens von Daten über einen unzuverlässigen Kommunikationskanal, z. B. eine Netzwerkverbindung, an. Sie müssen sicherstellen, dass Ihre Nachricht nicht durch Störungen beeinträchtigt wurde.

Ein Ansatz hierfür besteht darin, die Nachricht zweimal zu senden und nach Unterschieden zu suchen (tatsächlich besteht eine ziemlich geringe Möglichkeit, dass genau derselbe Fehler bei der Übertragung beider Nachrichten auftritt). Dies erfordert jedoch, ziemlich viel Bandbreite zu verwenden (zweimaliges Senden der Nachricht).

Ein effizienterer Ansatz besteht darin, basierend auf der Nachricht einen Wert zu berechnen und ihn an die Nachricht anzuhängen. Der Empfänger wendet dann dieselbe Funktion an und überprüft, ob der Wert derselbe ist.

Um ein intuitiveres Beispiel zu erhalten, kann die Prüfsumme eines Buches die Anzahl der Seiten sein. Du kaufst ein Buch aus der Bibliothek und zählst seine Seiten. Wenn die Anzahl der Seiten nicht Ihren Erwartungen entspricht, liegt ein Problem vor.

Sie implementieren eine bestimmte Prüfsummenfunktion (LSB der Summe), die in Ordnung ist. Alle Prüfsummenfunktionen haben einige Eigenschaften, die Sie beachten sollten, aber der Punkt ist, dass es keine richtige Möglichkeit gibt, eine Prüfsumme zu berechnen. Es gibt viele Funktionen, die für diesen Zweck verwendet werden können.

    
Paul92 25.12.2015 06:30
quelle
3

Normalerweise wird eine Prüfsumme verwendet, um eine Änderung der Daten zu erkennen. Kommunikation, Verschlüsselung / Signatur, etc ... Prüfsummen werden überall verwendet.

Wie kann eine Prüfsumme sinnvoll sein?

  • es erkennt eine Änderung an 1 Bit zum Beispiel
  • es erkennt sogar Änderungen, wenn mehr als 1 Bits geändert werden

Das mag paradox erscheinen, aber wenn sich nur 1 Bit ändert, wird Ihre Prüfsumme funktionieren. Nimm jedoch

%Vor%

und später

%Vor%

In (A) ist die Prüfsumme -1 ... und in (B) ist es +1. Plus und minus 1 == 0. Die zwei Fehler werden nicht von Ihrer Prüfsumme erkannt.

Grundsätzlich hängt die Qualität einer Prüfsumme ab

  • über die Länge der Prüfsumme (je größer die Prüfsumme, desto mehr größere Daten werden erfasst, ohne "looping" (ein Byte hat nur 256 Prüfsummen möglich, 2 Bytes hat 65536; beachten Sie, dass im obigen Fall mit Ihrem Algorithmus, der das Ergebnis nicht ändern würde)

  • die Qualität der Prüfsummenberechnung, um so weit wie möglich zu verhindern, dass sich zwei Unterschiede gegenseitig aufheben.

Es gibt viele verfügbare Algorithmen. Diese Antwort auf SO ist ein guter Anfang.

    
Ring Ø 25.12.2015 06:30
quelle

Tags und Links