AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Hash erzeugen während die Datei übertragen wird
Thema durchsuchen
Ansicht
Themen-Optionen

Hash erzeugen während die Datei übertragen wird

Ein Thema von gsh · begonnen am 13. Nov 2008 · letzter Beitrag vom 13. Nov 2008
Antwort Antwort
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#1

Hash erzeugen während die Datei übertragen wird

  Alt 13. Nov 2008, 15:25
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?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 13. Nov 2008, 15:33
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.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

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

  Alt 13. Nov 2008, 17:57
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
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

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

  Alt 13. Nov 2008, 18:06
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.dllname 'MD5Init';
procedure MD5Update(var context: MD5_CTX; const input; inputLength: word); stdcall; external 'Cryptdll.dllname 'MD5Update';
procedure MD5Final(var context: MD5_CTX); stdcall; external 'Cryptdll.dllname '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
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 13. Nov 2008, 18:17
Was benutzt Du denn für die Hashgenerierung? Eigene Unit? DEC? Betriebssystemfunktionen? Letztlich hat jede Implementierung diese 3 Low Level Funktionen - auch Deine .
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#6

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

  Alt 13. Nov 2008, 18:45
ok danke ich werds mit den drei proceduren testen
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 13. Nov 2008, 20:18
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 )
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.dllName 'MD5Init';
Procedure MD5Update(Var Context: MD5_CTX; Input: Pointer; inLen: LongWord); StdCall;
  External 'advapi32.dllName 'MD5Update';
Procedure MD5Final(Var Context: MD5_CTX); StdCall;
  External 'advapi32.dllName '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.
(würde unschöne Auswirkungen ergeben)
Delphi-Quellcode:
Procedure MD5Update(Var Context: MD5_CTX; Const Input; inLen: LongWord); StdCall;
  External 'advapi32.dllName 'MD5Update';
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

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

  Alt 13. Nov 2008, 20:40
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.
(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 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
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 13. Nov 2008, 21:06
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 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