tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
Like Tree3Danke
ERLEDIGT
NEIN
ANTWORTEN
22
ZUGRIFFE
1045
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    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

  2. #17
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Was sind große Dateien? >2GB?
     

  3. #18
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    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

  4. #19
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    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

  5. #20
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    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

    Andreas
    Geändert von Avedo (12.02.11 um 17:13 Uhr)
     
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  6. #21
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    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.
    - warum sind init(), append() und transform() public?

    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.

  7. #22
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Hallo!

    Zitat Zitat von deepthroat Beitrag anzeigen
    ... verwende konstante Referenzen als Argumente (du kopiert unnötig Daten beim jedem Aufruf) ...
    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.

    Zitat Zitat von deepthroat Beitrag anzeigen
    Fehler falls \0 Zeichen im String enthalten sind bei hashString(std::string)
    Wie kann ich das ändern? Das \0 Zeichen maskiert doch das Ende eines Strings.

    Zitat Zitat von deepthroat Beitrag anzeigen
    duplizierter Code - hashString(std::string) und hashString(std::basic_string<unsigned char> unterscheiden sich fast gar nicht voneinander
    Wird ja so oder so nach den unten vorgeschlagenen Änderungen hinfällig.

    Zitat Zitat von deepthroat Beitrag anzeigen
    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
    Wie kann ich das denn ändern? Wäre es anders, wenn ich alles in einer do...while Schleife verarbeite?

    Zitat Zitat von deepthroat Beitrag anzeigen
    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)
    Die Daten, die nicht sofort verarbeitet werden können, da ihre Länge nicht ein Vielfaches von 512 müssten dann gepuffert werden.

    Zitat Zitat von deepthroat Beitrag anzeigen
    ... warum sind init(), append() und transform() public?
    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.
    Angehängte Dateien Angehängte Dateien
    Geändert von Avedo (12.02.11 um 17:58 Uhr)
     
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  8. #23
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Avedo Beitrag anzeigen
    Wie kann ich das ändern? Das \0 Zeichen maskiert doch das Ende eines Strings.
    Du kannst doch die Länge direkt dem Konstruktor übergeben:
    Code cpp:
    1
    
    ustring input(reinterpret_cast<const unsigend char*>(in.data()), in.size());
    Wäre allerdings auch hinfällig...
    Zitat Zitat von Avedo Beitrag anzeigen
    Wie kann ich das denn ändern? Wäre es anders, wenn ich alles in einer do...while Schleife verarbeite?
    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).
    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
    }
    Zitat Zitat von Avedo Beitrag anzeigen
    Die Daten, die nicht sofort verarbeitet werden können, da ihre Länge nicht ein Vielfaches von 512 müssten dann gepuffert werden.
    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.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Bit Operationen NOR!
    Von Tsa im Forum Java
    Antworten: 6
    Letzter Beitrag: 10.11.09, 19:59
  2. File read/write + string operationen
    Von Thomasio im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 26.12.07, 11:35
  3. Boolsche Operationen - Wie?
    Von Thomas Rebele im Forum 3D Studio Max
    Antworten: 3
    Letzter Beitrag: 02.03.05, 00:15
  4. Mathematische Operationen
    Von deepgreen im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 29.05.03, 11:52
  5. Boolsche Operationen
    Von archdevil im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 03.06.02, 12:39

Stichworte