Alles rund um die Programmierung mit Qt
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 13:24
Hallo,
ich habe einen funktionieren Code um MD5 Summen von Dateien zu berechnen. Dazu verwende ich QByteArray QIODevice::readAll().
Code: Alles auswählen
QByteArray content = file->readAll();
QString md5 = QCryptographicHash::hash(content, QCryptographicHash::Md5).toHex();
Leider wird ab einer best. Größe (irgendwas ab 1Gb) nichts mehr gelesen. Laut Doc gibt die Funktion ja auch keine Fehler zurück.
Die Frage ist jetzt, was der Grund dafür ist und was ich stattdessen benutzen sollte (QTextStream?).
Danke
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 11. Juli 2009 13:30
1GB in den Speicher laden und dann wundern das nichts mehr geht? Wow...
Einfach stückchenweise lesen und fertig.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 13:33
Hm, da hätt ich auch selbst drauf kommen können.
Stückchenweise lesen? Wie macht man das am besten?
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 11. Juli 2009 13:44
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 13:51
Danke für den Link. Damit lässt sich mal was anfangen...
Tut mir leid, dass ich die Doku noch nicht auswendig kann.
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 11. Juli 2009 14:00
Es geht nicht darum die Doku auswendig zu lernen sondern einfach mal zu schauen was dort alles steht wenn man sowieso schon readAll() gefunden hat
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 14:48
Was anderes als Links zur Doku oder Begriffen zum Nachschlagen habe ich auch nicht verlangt. Deine Posts kommen nur sehr arrogant rüber.
Ich habe jetzt was lauffähiges zusammen geschrieben:
Code: Alles auswählen
QCryptographicHash md5sum( QCryptographicHash::Md5 );
while (!file->atEnd()) {
QByteArray line = file->readLine();
md5sum.addData(line);
}
Ich würde nur noch gerne wissen, obs eine bessere / performantere Lösung gibt.
Edit: Hat sich erledigt...
upsala
Beiträge: 3946 Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:
Beitrag
von upsala » 11. Juli 2009 15:53
Sollte deine Datei kein `\n` enthalten, liest du wieder die gesamte Datei auf einen Rutsch ein.
Verwende read() und eine vernünftige Blockgröße (irgendwas im kByte-Bereich)
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 16:21
Ja, da bin ich auch gerade am experimentieren. Ich brauche für später sowieso die "Teilchen" nicht zeilenweise, sondern byteweise.
Btw, weiß jemand, warum oft 16384 bytes verwendet werden?
Haben 16kb eine besondere Bedeutung beim Dateisystem-Zugriff?
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 11. Juli 2009 16:42
Nicht wirklich - solange es irgend eine Potenz von 2 ist sollte es optimal sein.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8 Registriert: 27. Mai 2009 12:26
Beitrag
von pixelflat » 11. Juli 2009 19:39
Hier der aktuelle Stand:
Code: Alles auswählen
QCryptographicHash md5sum( QCryptographicHash::Md5 );
QByteArray content;
char buf[16384];
qint64 lineLength = 2;
while (lineLength != 0)
{
lineLength = file->read(buf, sizeof(buf));
if (lineLength != -1)
content.append(buf, lineLength);
}
md5sum.addData(content);
this->resultText->append(md5sum.result().toHex());
Kleine Dateien funktionieren, bei größeren kommt gar nichts. Ich vermute weil wieder alles in QByteArray gespeichert wird - aber wie muss ichs dann machen? Ich brauch ja für die MD5-Summe alles.
Edit: Eigentlich werde ich nie den MD5-Wert von Dateien >1Gb berechnen müssen. Aber wenn dann will ichs schon richtig machen...
Edit: Ok, jetzt hab ichs. Keine Ahnung warum ich noch das ByteArray zusätzlich verwendet hab. Einfach 16kb lesen und an die Funktion übergeben...
Thx anyway.