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.
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!
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.
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.
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
Was XOR by 0xFF in 8-Bit-Daten tut, ist einfach äquivalent zur Umkehrung aller seiner Bits. Es fügt keine hinzu .
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:
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!
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.
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?
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.