Checksum

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
BenOve
Rookie
Rookie
Beiträge: 18
Registriert: Fr, 18. Sep 2015 14:24
Wohnort: Hestra Schweden

Checksum

Beitrag von BenOve »

Wie ist es möglch festzustellen ob zwei Dateien mit unterschiedliche Namen doch identisch sind ?

Ich denke zuerst an xppCrypt lin in XBASE aber dann muss der Datei gelesen werden und danach ein SHA-256 oder MD5 berechnen.
Aber ein 200 MB Datei wird nur langsam berechnet,
Es muss einen besseren Weg geben -

Ein MD5 kann so aussehen
944a1e869969dd8a4b64ca5e6ebc209a
Wie wahrscheinlich ist es das zwei gleiche MD5 checksums
von absolut identische dateien kommen ?

Wenn in XBASE keinen Ausweg gibt, ist vielleicht so einen GNU Datei die Lösung?
http://sourceforge.net/projects/md5summer/

Gruss
Bengt
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Checksum

Beitrag von georg »

Es gilt generell die Regel, dass zwei Dateien mit gleicher Grösse und gleichem MD5-Hash identisch sind.

Wobei man nun darüber streiten kann, was schneller ist: zwei Datein byteweise vergleichen, oder für zwei Dateien den MD5-Hash berechnen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Checksum

Beitrag von AUGE_OHR »

BenOve hat geschrieben:Wie ist es möglch festzustellen ob zwei Dateien mit unterschiedliche Namen doch identisch sind ?

Code: Alles auswählen

IF a = b
BenOve hat geschrieben:Ich denke zuerst an xppCrypt lin in XBASE aber dann muss der Datei gelesen werden und danach ein SHA-256 oder MD5 berechnen.
mit dem lesen des Files hast du Recht aber warum berechnen ?
BenOve hat geschrieben:Aber ein 200 MB Datei wird nur langsam berechnet,
Es muss einen besseren Weg geben -
die "Berechnung" a = b ist deutlich schneller als das lesen von 2 350MB grossen Dateien.

Code: Alles auswählen

#include "os.ch"

PROCEDURE MAIN(cDatei1,cDatei2)
LOCAL a := ""
LOCAL b := ""
LOCAL nStart
LOCAL nStop

IF FILE(cDatei1) .AND. FILE(cDatei2)

   ? Memory(MEM_VIRT_AVAIL)
   ? Memory(MEM_VIRT_TOTAL)
   ? Memory(MEM_RAM_AVAIL)
? "--------"
   nStart := SECONDS()
   a:= MEMOREAD(cDatei1)
   ? nStop := SECONDS() - nStart
? "--------"
   ? Memory(MEM_VIRT_AVAIL)
   ? Memory(MEM_VIRT_TOTAL)
   ? Memory(MEM_RAM_AVAIL)
? "--------"
   nStart := SECONDS()
   b:= MEMOREAD(cDatei2)
   ? nStop := SECONDS() - nStart
? "--------"
   ? Memory(MEM_VIRT_AVAIL)
   ? Memory(MEM_VIRT_TOTAL)
   ? Memory(MEM_RAM_AVAIL)
? "--------"
   nStart := SECONDS()
   IF a = b
      ? "JA"
   ELSE
      ? "NEIN"
   ENDIF
   ? nStop := SECONDS() - nStart
? "--------"
WAIT
ELSE
   ALERT("compare files <cDatei1> or <cDatei2> not found")
ENDIF
RETURN
! Note : Xbase++ kann nur 2GB verwalten also müssen die beiden Dateien < 1024 MB sein.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Checksum

Beitrag von brandelh »

Der direkte Vergleich geht nur bei kleineren Dateien (max 500 MB je nach eigenem Speicher)
Ein MD5 hash ist von der Dateigröße nicht beschränkt auf den Hauptspeicher UND wenn man diesen abspeichert kann man später prüfen ob die Datei geändert wurde.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Checksum

Beitrag von brandelh »

Die 2 GB Grenze gilt nur für DBFs, mit FOPEN() etc. kann man größere Dateien verarbeiten, aber externe MD5 Programme sind viel schneller.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Checksum

Beitrag von AUGE_OHR »

wie ich sagte : das "lesen" von 2 x 500MB dauert länger als das "berechnen" von irgendetwas ...

Xbase++ kann als 32bit Programm nur 2GB "verwalten" ... egal ob DBF oder RAM.

klar könnte man den MD5 "vorher" berechnen ... oder es "an" das File "anhängen" und man vergleicht nur den Teil.
gruss by OHR
Jimmy
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: Checksum

Beitrag von Wonderer »

AUGE_OHR hat geschrieben:wie ich sagte : das "lesen" von 2 x 500MB dauert länger als das "berechnen" von irgendetwas ...
Das verstehe ich nicht.
Wenn in der Berechnung der gesamte Inhalt der beiden grossen Files einbezogen wird - dann ist es doch Lesen + Berechnen und das müsste länger dauern?
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Checksum

Beitrag von georg »

Wenn wir über Assembler reden würden, wäre Lesen+Vergleichen wohl schneller als Lesen+Berechnen. Aber Xbase++ ist ja interpretierter Code (wenn auch schnell interpretierter Code), daher müsste man einen entsprechenden Vergleich durchführen, um festzustellen, was schneller geht. Es ist möglich, dass ein externes Programm schneller ist als die interne Berechnung.

Allerdings geht's auch einfacher: wenn exakt gleich grosse Dateien die Ausnahme sind, reicht ein Grössenvergleich über die directory() Funktion. Erst wenn zwei Dateien exakt gleich gross sind, muss ein Vergleich oder ein MD5-Hash für beide Dateien her.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Checksum

Beitrag von AUGE_OHR »

Wonderer hat geschrieben:
AUGE_OHR hat geschrieben:wie ich sagte : das "lesen" von 2 x 500MB dauert länger als das "berechnen" von irgendetwas ...
Das verstehe ich nicht.
Wenn in der Berechnung der gesamte Inhalt der beiden grossen Files einbezogen wird - dann ist es doch Lesen + Berechnen und das müsste länger dauern?
ich meine das physikalische "lesen" der Daten von SSD / HDD gegenüber einer Berechnung einer Checksumme selbst wie man am Beispiel ausprobieren kann.
MD5 hat IMHO nur Sinn wenn man es vorher berechnet so das man die Checksumme nachträglich zum vergleichen nutzen kann.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Checksum

Beitrag von AUGE_OHR »

Wonderer hat geschrieben:
AUGE_OHR hat geschrieben:wie ich sagte : das "lesen" von 2 x 500MB dauert länger als das "berechnen" von irgendetwas ...
Das verstehe ich nicht.
Wenn in der Berechnung der gesamte Inhalt der beiden grossen Files einbezogen wird - dann ist es doch Lesen + Berechnen und das müsste länger dauern?
ich meine das physikalische "lesen" der Daten von SSD / HDD gegenüber der Berechnung einer Checksumme selbst wie man am Beispiel ausprobieren kann.
MD5 hat IMHO nur Sinn wenn man es vorher berechnet so das man die Checksumme nachträglich zum vergleichen nutzen kann.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Checksum

Beitrag von brandelh »

Wonderer hat geschrieben:
AUGE_OHR hat geschrieben:wie ich sagte : das "lesen" von 2 x 500MB dauert länger als das "berechnen" von irgendetwas ...
Das verstehe ich nicht.
Wenn in der Berechnung der gesamte Inhalt der beiden grossen Files einbezogen wird - dann ist es doch Lesen + Berechnen und das müsste länger dauern?
Das Problem ist die Stringverwaltung die mit dem Hauptspeicher auskommen muss, ob Xbase++ mehr als 2 GM RAM verwalten kann weiß ich nicht (möglich wären 3 GM mit einem Flag),
aber für die Speicherverwaltung sind so große Strings im Hauptspeicher einfach tötlich (bis 300 MB hatte ich nie Probleme).
Wenn man dann 2 so große vergleichen will und noch andere Operationen eventuell Kopieen anlegen wird die Speicherverwaltung von Xbase stark gestreßt.

Falls nun im System keine 8 GB Hauptspeicher stecken muss auch noch ausgelagert werden ... richtig übel ;-)
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Checksum

Beitrag von georg »

Man kann natürlich hingehen und über fopen(), fread() jeweils passende Häppchen zu lesen und zu vergleichen. Dann bleibt man selbst bei TB-Dateien unter der kritischen Grenze.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten