![]() |
Hash erzeugen während die Datei übertragen wird
Hi Leute
mein Programm überträgt mit Hilfe der Indy Komponenten eine Datei übers Netzwerk/Internet. Dies klappt soweit auch ganz gut. Ich möchte jetzt aber noch mit Hilfe eines Hash-Wertes überprüfen ob die Datei auch wirklich richtig übertragen wurde. Wenn ich das aber jetzt so mache: * Datei übertragen * Hash von der Quell Datei erstellen * Hash übertragen * Hash von der Ziel Datei erstellen * Hash vergleichen Dadurch müsste ich aber die Datei zweimal von der Festplatte lesen (bei großer Dateien sehr blöd). Deswegen würde ich den Hash gerne während der Übertragung erstellen, damit ich die Datei nur einmal laden muss. Etwa so: * Datei übertragen (während der Übertragung Hash erzeugen) * Hash Wert übertragen * Hash vergleichen Also ein On-The-Fly Hash Erzeugung. Ist das möglich? |
Re: Hash erzeugen während die Datei übertragen wird
Ja. Beim Start der Übertragung den Context initialisieren, dann bei jedem Empfang von Daten Deine HashUpdate Funktion aufrufen für den empfangenen Datenbuffer und beim Beenden der Übertragung den Hash finalisieren. Initialisieren und Finalisieren können dabei übrigens optional sein. Je nach verwendetem Algo.
|
Re: Hash erzeugen während die Datei übertragen wird
Zitat:
Ich kenn bis jetzt nur funktionen wo man einen Dateinamen angibt und ein Hash kommt raus :mrgreen: |
Re: Hash erzeugen während die Datei übertragen wird
Du kannst die Windows-Crypt-API benutzen:
Delphi-Quellcode:
MfG,
type MD5_CTX = packed record
i: packed array[0..1] of longint; // ULONG[2] buf: packed array[0..3] of longint; // ULONG[4] _in: packed array[0..63] of byte; // unsigned char[64] digest: packed array[0..15] of byte; // unsigned char[16] end; procedure MD5Init(var context: MD5_CTX); stdcall; external 'Cryptdll.dll' name 'MD5Init'; procedure MD5Update(var context: MD5_CTX; const input; inputLength: word); stdcall; external 'Cryptdll.dll' name 'MD5Update'; procedure MD5Final(var context: MD5_CTX); stdcall; external 'Cryptdll.dll' name 'MD5Final'; // das nur mal als Beispiel wie es funktioniert function StreamToMD5String(x: TStream): string; var context: MD5_CTX; buffer: packed array[0..511] of byte; length: integer; i: integer; begin MD5Init(context); x.Position := 0; repeat length := x.Read(buffer, 512); MD5Update(context, buffer, length); until length <= 0; MD5Final(context); for i := 0 to 15 do result := result + IntToHex(context.digest[i], 2); end; Bug |
Re: Hash erzeugen während die Datei übertragen wird
Was benutzt Du denn für die Hashgenerierung? Eigene Unit? DEC? Betriebssystemfunktionen? Letztlich hat jede Implementierung diese 3 Low Level Funktionen - auch Deine ;).
|
Re: Hash erzeugen während die Datei übertragen wird
ok danke ich werds mit den drei proceduren testen
|
Re: Hash erzeugen während die Datei übertragen wird
dann verwende bitte auch die richtigen Definitionen!
Code:
procedure MD5Update(var context: MD5_CTX; const input; inputLength: [b]LongWord[/b]); ...
siehe: nja, eigentlich dachte ich wir hatten mal MD5 in der CodeLib, (kann's aber nicht finden :gruebel: ) aber dort isses och noch drin ![]()
Delphi-Quellcode:
das wäre natürlich auch noch richtig, aber wie gesagt unbedingt mit LongWord,
Type MD5_CTX = packed Record
i: Array[0.. 1] of LongWord; buf: Array[0.. 3] of LongWord; input: Array[0..63] of Byte; digest: Array[0..15] of Byte; End; Procedure MD5Init(Var Context: MD5_CTX); StdCall; External 'advapi32.dll' Name 'MD5Init'; Procedure MD5Update(Var Context: MD5_CTX; Input: Pointer; inLen: LongWord); StdCall; External 'advapi32.dll' Name 'MD5Update'; Procedure MD5Final(Var Context: MD5_CTX); StdCall; External 'advapi32.dll' Name 'MD5Final'; denn es wäre nicht gut, wenn die höheren 2 Byte undefiniert blieben. :warn: (würde unschöne Auswirkungen ergeben)
Delphi-Quellcode:
Procedure MD5Update(Var Context: MD5_CTX; Const Input; inLen: LongWord); StdCall;
External 'advapi32.dll' Name 'MD5Update'; |
Re: Hash erzeugen während die Datei übertragen wird
Zitat:
Aber das mit den höheren 2 Byte kann ich nicht so auf mir sitzen lassen: Zitat:
EDIT: Huch, da steht bei mir ja Word, ich dachte da steht auch LongInt. Danke für den Hinweis. MfG, Bug |
Re: Hash erzeugen während die Datei übertragen wird
du kannst auch ganz gern LongInt, Integer oder Cardinal verwenden ... im MSDN gibt es sowohl Integer (LongInt), als auch Unsigned Integer (Cardinal/LongWord), bei Definitionen dieser Funktion.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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