Autor |
Beitrag |
nGerrit
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 19:59
hey, ich habe zwei txt dateien und möchte gerne testen, ob der inhalt der beiden dateien gleich ist, oder nicht. (möglichst automatisch  ) wisst ihr, wie ich das machen könnte??
nGerrit
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Mi 13.08.03 20:01
1. Möglichkeit: Einlesen in ein Array und über CompareMem vergleichen. Ist aber langsam und bei großen Dateien speicherfressend
2. Möglichkeit: Bilden der Hashwerte (CRC, MD5, etc.) beider Dateien und diese vergleichen. Schneller.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
nGerrit
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 20:50
dateien sind nicht groß 1kb.. wie genau bekomm ich die in ein array??? nGerrit
|
|
Adrian
      
Beiträge: 314
|
Verfasst: Mi 13.08.03 21:27
Servus,
wie wär's mit "Shellexecute" und dem guten alten DOS-Befehl "FC"?
Gruß,
Adrian
|
|
BungeeBug
      
Beiträge: 901
|
Verfasst: Mi 13.08.03 21:29
wie wär mal wieder mit dem genialen MD5 Algo? ... so genau schnell und sicher is FC unter Garantie nicht 
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 13.08.03 22:50
BungeeBug hat folgendes geschrieben: | wie wär mal wieder mit dem genialen MD5 Algo? |
Und was passiert, wenn man zwei Dateien erwischt, die den selben MD5 Wert haben, aber nicht identisch sind?
MD5 ist nicht eindeutig. Wenn das nämlich der Fall wäre, dann hätten die Erfinder von MD5 wohl die beste Komprimierungsmethode gefunden.
_________________ Ist Zeit wirklich Geld?
|
|
nGerrit
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 23:09
hey  könnt ihr mir sagen, wie ich eine zeile einer txt datei in einen string einlesen kann? ich bekomms nicht hin
nGerrit
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 13.08.03 23:47
_________________ Ist Zeit wirklich Geld?
Zuletzt bearbeitet von AndyB am So 17.08.03 16:28, insgesamt 1-mal bearbeitet
|
|
nGerrit
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 00:19
jau thx. und was, wenn ich die zweite zeile (eigentlich 8-12)auslesen will?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 04:00
Ein Zeilenumbruch ist aber #13#10 unter Windows. 
|
|
BungeeBug
      
Beiträge: 901
|
Verfasst: Do 14.08.03 09:20
AndyB hat folgendes geschrieben: | BungeeBug hat folgendes geschrieben: | wie wär mal wieder mit dem genialen MD5 Algo? |
Und was passiert, wenn man zwei Dateien erwischt, die den selben MD5 Wert haben, aber nicht identisch sind?
MD5 ist nicht eindeutig. Wenn das nämlich der Fall wäre, dann hätten die Erfinder von MD5 wohl die beste Komprimierungsmethode gefunden. |
MD5 ist eindeutig nur kann man es nicht rückganägig machen. Sprich du kannst ja nicht aus der Summe aller 1sen fest stellen wo die eigendlich hingehören. <- So funktioniert zwar der MD5 nicht aber als Beispiel is das garnicht schlecht 
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 14.08.03 12:55
Luckie hat folgendes geschrieben: | Ein Zeilenumbruch ist aber #13#10 unter Windows.  |
Ja. Und das berücksichtigt meine Auslesefunktion auch. (Genauer hinschauen).
_________________ Ist Zeit wirklich Geld?
|
|
recall
      
Beiträge: 449
|
Verfasst: Do 14.08.03 14:26
Ich würde es so machen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure compare(File1, File2: String): Boolean; var a, b: TextFile; Eq: Boolean; s1, s2: String; begin AssignFile(a, File1); Reset(a); AssignFile(b, File2); Reset(b); Eq := True; While (not Eof(a)) and (not Eof(b)) and (not Eq) do begin Readln(a, s1); Readln(b, s2); if s1<>s2 then Eq := False; end; CloseFile(a); CloseFile(b); Result := Eq; end; |
Parameter beim Aufrufen sind wohl klar  .
@BungeeBug: Also NEIN. Es gibt keinen eindeutigen nicht umkehrbaren Algorithmus. Das wäre auch zu schön.
Das ganze ist mathematisch beweisbar, aber auch so:
Vergleich mal den MD5-Code von: 1101 und 0111
(Ich kenn' MD5 nicht, nur aus dem was du geschrieben hast, ist es wohl die Summe aller Einsen ?)
=> Es gibt KEINE nicht reversible eindeutige Funktion, wenn es so wäre, dann könnte ich aus dem MD5-Code wieder einen MD5-Code machen usw... Am Ende wäre es dann eine 1 oder eine 0. Das kann ja wohl nicht eindeutig ein bestimmter vorher riesiger Datensatz gewesen sein, oder ?
=> Noch ein Grund: Vielleicht kennst du dich mit Verschlüsselung ein wenig aus ? Das was du beschreibst, hätten wohl alle Programmierer eines asymmetrischen Verfahrens gerne  . Dann könnte man beiden PCs einen Anfangscode geben und daraus einen nicht reversiblen Code erzeugen => DIE ABSOLUT SICHERSTE VERSCHLÜSSELUNG ! EIN QUASI-ONE-TIME-PAD.
Viele Grüsse.
P.S.: Der obige Code ist im FOrum geschrieben, kann sein, dass ich Params vertauscht habe.
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 14.08.03 14:32
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 14.08.03 14:48
Zitat: | ich glaube, das geht nur so: |
Glaube nicht, sondern probiere es aus. Der Compiler wird dir aber dabei was husten, denn ein Char ist ein Char und kein String. Anders ausgedrückt: Wie sieht denn das erste Zeichen eines einzelnen Zeichens aus? Und wie das zweite, dritte, ...?
_________________ Ist Zeit wirklich Geld?
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 14.08.03 15:09
MD5 ist eine OneWay-Hash Funktion die einen 128Bit Hash-Wert berechnet. D.h. es praktisch jede 2^128te Datei hat denselben MD5-Hash bzw als Zahl ausgedrückt jede 340282366920938463463374607431768211456te Datei erzeugt denselben Hash-Wert! Da Hashfunktionen normalerweise mehrere Werte auf ein und denselben Wert abbilden, kann man mit ihnen zwar nicht hundertprozentig aber mit ausreichender Sicherheit entscheiden ob 2 Strings identisch sind.
Aber ich würde SHA1 statt MD5 nehmen (erzeugt einen 160Bit Hash-Wert)!
PS: gute Hash-Funktionen sind kollisionsfrei, d.h. es ist schwierig 2 Originale mit demselben Hash-Wert zu generieren! Also nix mit "die Summe aller Einsen", das ist schon wesentlich komplexer mit tiefem math. Hintergrund!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
recall
      
Beiträge: 449
|
Verfasst: Do 14.08.03 19:40
@Motzi: Und bei welcher Länge soll diese Zahl gelten (Dateilänge) ?
Denn die sich-wiederholen-Zahl (Q) ist bei solchen Verfahren Q~size(File)^n n Element aus N>0.
Beweis: Nimm 2 Dateien mit je 1 Byte Länge  .
Viele Grüsse.
P.S.: Aber man kann so eine Funktion ja als vorab-Test nehmen.
Erst wenns stimmt soll das Prog genauer gucken  .
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 14.08.03 19:50
@recall: sorry, komm jetzt nicht ganz mit auf was du hinaus willst.. kannst du das mal näher erleutern?
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
recall
      
Beiträge: 449
|
Verfasst: Do 14.08.03 20:06
Zitat: | 340282366920938463463374607431768211456te Datei erzeugt denselben Hash-Wert! |
Das geht doch gar nicht !! Nimm einfach mal eine Datei mit 1 Byte Länge.
Es gibt nur 256 Möglichkeiten, wie die Datei aussehen kann  .
Das jetzt nur ganz vereinfacht gesagt...
Also, ich will damit sagen, dass deine Zahl nur für EINE Dateigröße gilt, alle anderen erfasst du damit nicht.
Sollte diese Zahl jedoch die Wahrscheinlichkeit angeben, die wievielte Datei unter oo-vielen den gleichen Hash-Wert erzeugen, so würde ich die Methode wegschmeißen, denn es kann genauso gut sein, dass eine Datei mit MD5("001") = MD5("101") !
Viele Grüsse.
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 14.08.03 21:17
AndyB hat folgendes geschrieben: | Zitat: | ich glaube, das geht nur so: |
Glaube nicht, sondern probiere es aus. Der Compiler wird dir aber dabei was husten, denn ein Char ist ein Char und kein String. Anders ausgedrückt: Wie sieht denn das erste Zeichen eines einzelnen Zeichens aus? Und wie das zweite, dritte, ...? |
huuuuups. hab mich jetzt total vertan. ich hab aus irgendeinem
unerklärlichen grund gedacht ch is ein string, aber es steht ja da, dass
es ein Char ist, außerdem würde man einen string nicht ch nennen.
ääähmm ... sorry.
shadow.
|
|