![]() |
[DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Hi@all
Ich verwende Hagens MD_5 Hash um eine Datei eindeutig identifizieren zu können. Habe eine Dateiübertragung mit Fortsetzung bei Unterbrechung geschrieben. Der Sender berechnet zunächst aus einer Datei einen MD5 Hash, schickt diesen zum Empfänger. Dieser guckt in einer Liste nach, ob der entsprechende Hash schon vorhanden ist, sucht die zugehörige Datei raus, ermittelt die Stream position, schickt diese an den Sender zurück. Mein Problem ist nur: Bei sehr großen Dateien benötigt das berechnen des Hashes eine ganze menge Zeit. In dieser Zeit ist das Forumlar eingefrohren. Was kann ich dagegen tun? Hagen hat dieses IDECProgress eingebaut. Aber damit komme ich nicht wirklich zurecht (Habe keine Klasse vom Typ TForm). Und einen extra Thread zu programmieren halte ich für übertrieben... Vielen Dank für eure Hilfe und schönes FUssball Wochenende! Euer Alleinherrscher |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Um einen extra Thread wirst du dann aber nicht drum rum kommen.
|
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
mal aus interesse: wie groß ist denn eigentlich sehr groß und was ist eine ganze Menge?
|
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Zitat:
@Luckie: Danke, wenn du das sagst, werd ichs wohl doch so machen :) |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Man könnte das so lösen:
TFileStream -> TIntercepterStream -> DEC_MD5 Ich nehme mal an DEC kann einen MD5 über alle Daten eine Streams berechnen. Würdest du ein TFileStream bereithalten und an DEC übergeben, wäre alles wie bisher. Jetzt kommt die Klasse TInterceptorStream ins Spiel. Die Klasse wird von TStream abgeleitet und macht eigentlich nichts anderes als die Aufrufe .Read() und .Write() an ein anderes Stream-Objekt durchzureichen. Zusätzlich hat es aber die Events OnBeforeRead, OnAfterRead, OnBeforeWrite und OnAfterWrite. Für diese Event kann dein Prog. einen EventHandler bereitstellen und Application.ProcessMessages aufrufen. TInterceptorStream gibt es noch nicht; man müsste sie erst noch programmieren. siehe auch: http://de.wikipedia.org/wiki/Stellvertreter_(Entwurfsmuster) |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Also Hagen löst das Problem so:
Zitat:
Viele Grüße und Danke nochmal |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Delphi-Quellcode:
class(TInterfacedObject, IDECProgress)
|
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Zitat:
Wunderbar es funktioniert. Danke Dax! Hier nochmal die zusammenfassung: 1. Eine neue Klasse definieren:
Delphi-Quellcode:
in die prozedur Process kommt nur ein Application.processmessages
THash_Helper = class (TInterfacedObject,IDECProgress)
procedure Process(const Min,Max,Pos: Int64); stdcall; end; Dort wo ihr den Hash berechnen wollt kommt hin:
Delphi-Quellcode:
HashHelper1:=THash_Helper.Create;
pack.MD5_Hash:=THash_MD5.CalcStream(data,data.size,TFormat_HEX,HashHelper1); freeandnil(HashHelper1); Grüße und danke nochmal an alle! |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
ok, 3 GB ist schon recht groß
hatte da Aufgrund der Dateiübertragung eher was Kleineres vermutet :stupid: aber 25 MB/s ... eventuell mal nach 'ner schnelleren Platte schauen :angel2: (gut, so schlimm ist der Wert nun auch nicht) also da macht sich ein Thread wirklich gut :angel: |
Re: [DEC] MD5 Hash großer Datei berechnen ohne Programhänger
Zitat:
Die Geschwindigkeit ist vollkommen okay, nur sollte halt das Programm nicht einfrieren dabei :) //OffTopic: Es geht mal wieder um Lan.FS ( ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz