-
Hallo!
Vielen Dank für deine Hilfe, euer aller Hilfe. Habe leider nur begrenzt Daumen.
Das Programm läuft nun, auch wenn ich mich gerade noch etwas verrückt gemacht habe, da ich einen anderen Hash aus einer Datei generiert habe, als der oben gepostete MD5-Generator. Allerdings habe ich dann meinen Hash mit der Ausgabe des unter XUbuntu automatisch verfügbaren Programms md5sum verglichen und das hat das gleiche Resultat geliefert.
Das Programm unterstützt nun die Verarbeitung von Dateien unter angabe des Dateipfades, von Strings, die mit -s, Testfällen und Zeit-Tests, die mit -x und -t angegeben werden können. Die Befehle können natürlich auch wild hintereinander geschrieben werden.
Beispiele:
Code :1 2 3 4 5
./md5 -x ./md5 ~/Videos/myvideo.avi ./md5 -t ~/Videos/myvideo.avi ./md5 -s "The quick brown fox jumps over the lazy dog" ./md5 -t -s "Bli Bla Blubb" ~/Videos/vid1.avi -t ~/Videos/vid2.avi -x
Das komplette Programm findet man nochmal im Anhang.
Liebe Grüße
Andreas
PS: Das Programm konnte den Hash einer 704MB großen *.avi Datei in nur 3.64 Sekunden bilden.
PSS: Komischer Weise gab es im übrigen Probleme, wenn ich Dateien mit dem C++ ifstream anstatt des C FILE-Handles gelesen habe. Welchen Grund könnte das haben?
EDIT: Er frisst zwar vieles, jedoch hat er bei großen Dateien Probleme. Woran kann das liegen.Geändert von Avedo (11.02.11 um 14:32 Uhr)
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
-
Was sind große Dateien? >2GB?
-
Nein leider nicht. Nach der Umstellung auf C-FILE Handles kann ich schon Dateien von 700 mb nicht mehr verarbeiten.
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
-
Kein Wunder, du liest die Dateien schließlich ohne guten Grund komplett in den Speicher ein. Du solltest eine Methode anbieten, die es erlaubt, eine Zeichenkette Stück für Stück an deine Klasse zu übergeben. Diese sollte den den Hashwert dann inkrementell berechnen.
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
Ich habe nun das Programm so abgeändert, dass Strings und Dateien unterschiedlich behandelt werden. Es kommt nun auch zu einer Blockweisen Verarbeitung, an deren Ende erst das Padding vorgenommen wird.
Dank dieser Änderungen funktioniert nun auch die Verarbeitung beliebig großer Dateien ohne Probleme.
Vielen Dank an alle Helfer. Die neueste Version habe ich angehängt.
Liebe Grüße
AndreasGeändert von Avedo (12.02.11 um 17:13 Uhr)
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
-
11.02.11 15:20 #21
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Einige Probleme / Verbesserungen:
- verwende konstante Referenzen als Argumente (du kopiert unnötig Daten beim jedem Aufruf)
- Fehler falls \0 Zeichen im String enthalten sind bei hashString(std::string)
- duplizierter Code - hashString(std::string) und hashString(std::basic_string<unsigned char> unterscheiden sich fast gar nicht voneinander
- feof ist evtl. erst gesetzt wenn versucht wurde hinter das Ende der Datei zu lesen, falls die Dateigröße ein Vielfaches von 1024 ist, wird der Check innerhalb der while Schleife in hashFile nie aufgerufen
- verarbeite Strings doch ebenfalls wie bei Dateien (im Grunde brauchst du nur eine allgemeine Funktion die auf Daten arbeitet -- da pumpst du Daten rein und finalisierst dann irgendwann mal)
Bsp:
- warum sind init(), append() und transform() public?Code cpp:1 2 3 4 5 6 7 8 9 10
md5 hash; // ruft init() auf. bzw. initialsiert im Konstruktor hash.update(std::string("alblual")); hash.update("asdfa"); char x[] = ...; hash.update(x); hash.digest(); // finalisiert und gibt digest zurück hash.hex_digest(); // gibt einen hex digest zurück md5 file_hash; file_hash.update(ifstream("bla.blub")); // usw.
GrußGeändert von deepthroat (11.02.11 um 15:31 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo!
Guter Hinweis. Werde ich ändern. Wäre es denn nicht auch sinnvoll roundRot und radians als static const direkt in der Header Datei zu initialisieren. Die ändern sich doch eigentlich nie.
Wie kann ich das ändern? Das \0 Zeichen maskiert doch das Ende eines Strings.
Wird ja so oder so nach den unten vorgeschlagenen Änderungen hinfällig.
Wie kann ich das denn ändern? Wäre es anders, wenn ich alles in einer do...while Schleife verarbeite?
Die Daten, die nicht sofort verarbeitet werden können, da ihre Länge nicht ein Vielfaches von 512 müssten dann gepuffert werden.
Oh man. Da fragst du den falschen. Weiß ich selbst nicht. Schon geändert.
Danke für deine vielen Hinweise, habe wohl jetzt noch einiges zu tun.
Liebe Grüße
Andreas
Edit: Habe mal die wichtigsten Dinge geändert. Die Methoden append() und transform() sind nun private, init() wurde vollkommen entfernt, transform(), hashString() und append() erhalten nun Referenzen als Parameter und sowohl roundRot[], als auch radians[] werden schon in der Klasse initialisiert. Diese wenigen Änderungen haben einen Performance-Gewinn von ungefähr 30% gebracht.Geändert von Avedo (12.02.11 um 17:58 Uhr)
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
-
12.02.11 18:39 #23
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Du kannst doch die Länge direkt dem Konstruktor übergeben:
Wäre allerdings auch hinfällig...Code cpp:1
ustring input(reinterpret_cast<const unsigend char*>(in.data()), in.size());
Nein. Es ist sowieso relativ unsinnig ständig in der Schleife abzufragen ob EOF erreicht ist. EOF ist genau dann erreicht wenn die Schleife vollständig durchgelaufen ist (und nicht ferror gesetzt ist).
Ja, das sind ja nur 63 Bytes. Da wäre es evtl. eine gute Idee den aktuellen Block einfach als Attribut der Klasse zu definieren. Und die transform Methode nicht mehr auf ustring sondern einfach auf (const unsigned char*, size_t) zu definieren. So mußt du nicht mehr ständig die Daten in den String rein und aus dem String in das Array kopieren.Code cpp:1 2 3 4 5 6 7 8 9
while (... = fread(...)) { } if (!ferror(f)) { assert(feof(f)); blockStr = append(blockStr, counter); transform(blockStr); } else { // error / exception }
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Bit Operationen NOR!
Von Tsa im Forum JavaAntworten: 6Letzter Beitrag: 10.11.09, 19:59 -
File read/write + string operationen
Von Thomasio im Forum C/C++Antworten: 1Letzter Beitrag: 26.12.07, 11:35 -
Boolsche Operationen - Wie?
Von Thomas Rebele im Forum 3D Studio MaxAntworten: 3Letzter Beitrag: 02.03.05, 00:15 -
Mathematische Operationen
Von deepgreen im Forum Visual Basic 6.0Antworten: 3Letzter Beitrag: 29.05.03, 11:52 -
Boolsche Operationen
Von archdevil im Forum Cinema 4DAntworten: 1Letzter Beitrag: 03.06.02, 12:39



3Danke

Zitieren


Login






