Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   C++ Prüfsummer über gewisse Anzahl Integer-Werte (https://www.delphipraxis.net/166216-pruefsummer-ueber-gewisse-anzahl-integer-werte.html)

RalfE 3. Feb 2012 08:58

Prüfsummer über gewisse Anzahl Integer-Werte
 
Hallo,

ich bekomme über eine Maschinensteuerung eine gewisse Anzahl an Integer-Werten (Koardinaten). Über diese Werte wollte ich gern eine
Prüfsumme bilden, um festzustellen haben sich die Werte geändert oder gar ihre Reihenfolge ?

Mit welchem Algorithmus ? Gibt es dazu schon BeispielCode ?
Gruss
RalfE

sx2008 3. Feb 2012 09:14

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Da gibt es verschiedene Möglichkeiten.
Man angenommen, die Integerwerte liegen in einem Array vor.

1.) Summe über alle Integerwerte bilden (ein Überlauf wird dabei gezielt in kauf genommen)
2.) XOR über alle Integerwerte bilden
3.) Eine CRC32 Prüfsumme über den Speicherblock des Arrays bilden
4.) MD4 Hashwert über den speicherblock des Arrays bilden

Die Varianten 1 und 2 sind einfach und schnell zu berechnen aber nicht sehr sicher.
Eine Vertauschung zweier Werte ändert die Prüfsumme nicht.

Variante 3 ist schnell zu berechnen und die 32Bit-Prüfsumme in aller Regel ausreichend
Variante 4 ist schon sehr sicher. Prüfsumme ist 16 Bytes lang.

Man könnte statt MD4 auch MD5 verwenden; allerdings passt das einfachere und schnellere MD4 besser zur Aufgabe.

himitsu 3. Feb 2012 09:21

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Prüfsumme ...
CRC?

Da gibt es Millionen ... du mußt dir nur eine aussuchen.
'ne Quersumme bilden, XOR+SHL+SHR, CRC16 oder CRC32 mit unterschiedlichen Polynomen, MD4, MD5, RipeMD160, RipeMD320, SHA und sonstige Hash-Verfahren uvm.

http://de.wikipedia.org/wiki/Pr%C3%BCfsumme

Jumpy 3. Feb 2012 09:36

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Zitat:

Zitat von RalfE (Beitrag 1148994)
Hallo,
Prüfsumme bilden, um festzustellen haben sich die Werte geändert oder gar ihre Reihenfolge ?

Wie willst du das machen?
Angenommen du kriegst die Werte 1,2,3,4
Dann kriegst du die Werte 1,2,4,3.

Haben sich nun sowohl an Position drei, als auch an vier die Werte geändert und zufällig jeweils in den anderen Wert, oder...
...hat sich die Reihenfolge der Werte geändert?

RalfE 3. Feb 2012 10:49

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Hallo,

Danke für die Antworten.

Ich merke mir die Prüfsumme, hat sich die neue Prüfsumme geändert (andere Werte, Reihenfolge geändert), so wird meine Auswerte-Routine aktiv.

RalfE

mjustin 4. Feb 2012 09:04

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Zitat:

Zitat von RalfE (Beitrag 1149013)
Hallo,

Danke für die Antworten.

Ich merke mir die Prüfsumme, hat sich die neue Prüfsumme geändert (andere Werte, Reihenfolge geändert), so wird meine Auswerte-Routine aktiv.

Das ist aber nicht zuverlässig. Prüfsummen werden normalerweise eingesetzt, um den korrekten Empfang der Daten beim Empfänger zu verifizieren: http://de.wikipedia.org/wiki/Pr%C3%BCfsumme

Hierbei werden Daten und Prüfsumme beim Empfänger verwendet, der Empfänger errechnet die Prüfsumme neu aus den Daten!

Wenn aber nur die Prüfsumme beobachtet wird, kann es durchaus sein dass zwei Datensätze aufeinanderfolgen, die verschieden sind aber die gleiche Prüfsumme erzeugen.

Dann würde die "Auswerte-Routine nicht aktiv".

jfheins 4. Feb 2012 13:02

AW: Prüfsummer über gewisse Anzahl Integer-Werte
 
Zitat:

Zitat von RalfE (Beitrag 1148994)
Über diese Werte wollte ich gern eine
Prüfsumme bilden, um festzustellen haben sich die Werte geändert oder gar ihre Reihenfolge ?
Mit welchem Algorithmus ? Gibt es dazu schon BeispielCode ?

Mein Tipp: Lass es. Ich weis nicht, wie viele Bytes du da hast. Aber solange es nicht Gigabyte an Daten sind, ist es vermutlich schneller (und genauer!) die Daten an sich zu vergleichen.
Ein Prüfsummenalgorithmus muss ebenfalls jedes Byte der neuen Daten angucken und verrechnen. Stattdessen kannst du es auch gleich mit dem entsprechenden Byte der alten Daten vergleichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz