Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Hash erzeugen während die Datei übertragen wird (https://www.delphipraxis.net/124043-hash-erzeugen-waehrend-die-datei-uebertragen-wird.html)

gsh 13. Nov 2008 14:25


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?

Fridolin Walther 13. Nov 2008 14:33

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.

gsh 13. Nov 2008 16:57

Re: Hash erzeugen während die Datei übertragen wird
 
Zitat:

Zitat von 0xF30FC7
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.

Ja das war mir schon klar ... mir gehts eher um diese HashUpdate Funktion
Ich kenn bis jetzt nur funktionen wo man einen Dateinamen angibt und ein Hash kommt raus :mrgreen:

BUG 13. Nov 2008 17:06

Re: Hash erzeugen während die Datei übertragen wird
 
Du kannst die Windows-Crypt-API benutzen:
Delphi-Quellcode:
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;
MfG,
Bug

Fridolin Walther 13. Nov 2008 17:17

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 ;).

gsh 13. Nov 2008 17:45

Re: Hash erzeugen während die Datei übertragen wird
 
ok danke ich werds mit den drei proceduren testen

himitsu 13. Nov 2008 19:18

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
http://www.delphipraxis.net/internal...=811141#811141
Delphi-Quellcode:
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';
das wäre natürlich auch noch richtig, aber wie gesagt unbedingt mit LongWord,
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';

BUG 13. Nov 2008 19:40

Re: Hash erzeugen während die Datei übertragen wird
 
Zitat:

Zitat von himitsu
das wäre natürlich auch noch richtig, aber wie gesagt unbedingt mit LongWord,
denn es wäre nicht gut, wenn die höheren 2 Byte undefiniert blieben. :warn:
(würde unschöne Auswirkungen ergeben)

Hm, LongWord gibt es bei mir (Delphi 3) AFAIK noch nicht, aber ich hätte wohl Cardinal nehmen sollen.

Aber das mit den höheren 2 Byte kann ich nicht so auf mir sitzen lassen:
Zitat:

Zitat von D3 Hilfe
Longint -2147483648..2147483647 32 Bit einschließlich Vorzeichen



EDIT: Huch, da steht bei mir ja Word, ich dachte da steht auch LongInt.

Danke für den Hinweis.

MfG,
Bug

himitsu 13. Nov 2008 20:06

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 06:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz