Seite 1 von 1

Checksum

Verfasst: Fr, 16. Okt 2015 6:52
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

Re: Checksum

Verfasst: Fr, 16. Okt 2015 6:57
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.

Re: Checksum

Verfasst: Fr, 16. Okt 2015 8:19
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.

Re: Checksum

Verfasst: Fr, 16. Okt 2015 12:24
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.

Re: Checksum

Verfasst: Fr, 16. Okt 2015 12:25
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.

Re: Checksum

Verfasst: Fr, 16. Okt 2015 19:20
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.

Re: Checksum

Verfasst: Sa, 17. Okt 2015 12:07
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?

Re: Checksum

Verfasst: Sa, 17. Okt 2015 12:54
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.

Re: Checksum

Verfasst: Sa, 17. Okt 2015 22:00
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.

Re: Checksum

Verfasst: Sa, 17. Okt 2015 22:01
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.

Re: Checksum

Verfasst: So, 18. Okt 2015 18:31
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 ;-)

Re: Checksum

Verfasst: So, 18. Okt 2015 18:40
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.