Dateien vergleichen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Dateien vergleichen

Beitrag von xXRobo_CubeXx »

Hi :)
Ich hab zwei Dateien die gleich oder unterschiedlich sein können und das möchte ich prüfen ob indentisch oder nicht. Nur wie mache ich das am besten ? Beide Dateien komplett in Strings laden und beide Strings vergleichen?
Version 5.41 LTS :)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Dateien vergleichen

Beitrag von RSBasic »

Du kannst die Dateien z.B. mit MD5 vergleichen: MD5FileFingerprint()
Wenn du irgendwann auf eine neuere Version umsteigst, dann: FileFingerprint() und #PB_Cipher_MD5
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Dateien vergleichen

Beitrag von NicTheQuick »

MD5 ist schnell, hat aber viele Kollisionen. SHA256 oder höher ist zu bevorzugen.
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Dateien vergleichen

Beitrag von xXRobo_CubeXx »

Warum gib es Kollisionen? Was passiert genau beim kollidieren? Explodieren die Dateien wie bei Cobra 11? :D :D :D Was heisst das und wann kann das auftreten? :)
Version 5.41 LTS :)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Dateien vergleichen

Beitrag von NicTheQuick »

Wenn du eine Prüfsumme erstellst, wird mittels eines bestimmten Verfahrens (MD5, SHA-1, SHA-2, ...) aus einer beliebig großen Datenmenge ein immer gleich langer Schlüssel (Prüfsumme) erzeugt. Bei MD5 sind es 32 hexadezimale Ziffern, das heißt 128 Bit Daten. Wenn du jetzt die MD5-Prüfsumme von einer Datei der Größe 1 GB erstellst, werden 8 GBit Daten auf 128 Bit abgebildet. Mit Prüfsummen versucht man nun große Daten auf kleine abzubilden, weil man sie so leichter vergleichen kann. Allerdings kann es natürlich zu Kollisionen kommen, d. h. verschiedene Eingangsdaten können die selbe Prüfsumme ergeben. Das erscheint logisch, da man aus der Prüfsumme, die ja nur 128 Bit lang ist, nie und nimmer die 1 GBit eindeutig rekonstruieren kann. Wäre das der Fall, wäre das ein super Packalgorithmus. :D

Hier ein Beispiel einer Kollision von MD5: Collisions in the MD5 cryptographic hash function
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Dateien vergleichen

Beitrag von xXRobo_CubeXx »

thx für die super hammer geile tolle Erklärung sehr verständlich :allright: :)
Version 5.41 LTS :)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Dateien vergleichen

Beitrag von GPI »

Schlussfolgerung daraus: Lies sie blockweise ein und vergleich sie. Selbst wenn der MD5 gleich ist, kannst du nie sicher sein, das die Dateien wirklich gleich sind. So eine Checksum/Prüfsumme ist nur praktisch, wenn du wirklich viele gleich große Dateien hast und wissen willst, welche theoretisch gleich sein könnten. Mittels der Summen kannst du dann eine Vorauswahl treffen.

In Strings laden ist eine schlechte Idee, da die bei einen null-byte enden können. Ich würde zwei Speicher reservieren (bspw. 10 MB), die Daten aus den beiden Dateien in die Blöcke laden (readdata) - in 10 MB schritten halt und dann jeden Schritt mit MemoryCompare vergleichen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten