AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Md5

Ein Thema von Moonlight · begonnen am 27. Aug 2004 · letzter Beitrag vom 30. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
Moonlight

Registriert seit: 16. Aug 2004
11 Beiträge
 
#1

Md5

  Alt 27. Aug 2004, 14:45
Hallo zusammen,

ich bin Delphi-Neuling und habe eine Frage an Euch spezialisten.

Und zwar:

Ich möchte ein Updateprog schreiben, welches über Md5 - Checksummen ermittelt, ob sich eine Datei geändert hat.
Diese Checksummen speicher ich in einem XML ab und schicke dieses an den Server. Damit aber nicht direkt alle Checksummen auf dem Server kontrolliert werden müssen (es sind ca. 4700 Stück), wollte ich zuerst eine Gesamtchecksumme an den Server schicken. Wenn diese übereinstimmt, muss kein Update durchgeführt werden. Andernfalls doch.
Mein Problem ist allerdings, dass ich nicht genau weiß wie ich eine Gesamtchecksumme berechnen soll. Die einzelnen Md5-Checksummen hab ich schon.
Ich hatte überlegt, alle Checksummen zu addieren und aus der Summe wiederum eine Md5-Checksumme zu bilden. Das Problem ist, die Checksummen liegen als string vor, ich müsste die Checksummen zunächst umwandeln, doch die Md5-Summen sind sehr lang und passen nicht in einen Integer.

Hat einer von Euch eine Idee, wie ich das anstellen könnte? Ich wäre für jede Hilfe sehr dankbar. Vielleicht weiß auch einer eine andere Lösung?

Danke schonmal im voraus!
Moonlight
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#2

Re: Md5

  Alt 27. Aug 2004, 14:48
such dir ne compo, die strings hashen kann ( www.cityinthesky.co.uk ) (vielleicht kann es auch das dec), dann kleister alle unter-hashs aneinander (als ein string, oder wie auch immer -- das teil von cityinthesky verarbeitet auch streams und untypisierte daten) und bilde davon den hash. den kannst du dann abgleichen.

allerdings sollte es kein problem sein, 5000 hashes zu verschicken, 5000 * 32 byte = 160kb, plus ein bisschen overhead...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Moonlight

Registriert seit: 16. Aug 2004
11 Beiträge
 
#3

Re: Md5

  Alt 27. Aug 2004, 14:58
Hi,
danke für die schnelle Antwort, allerdings bin ich, wie gesagt, ein Neuling und weiß nicht genau wie ich das anstellen mit den Hashs soll... Mit Hash hab ich noch nicht so viel gemacht...

  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Md5

  Alt 27. Aug 2004, 15:48
Ich würde alle Hashs in einen Datenpuffer schreiben und dann von diesem Puffer den Hashwert bilden. Alles andere macht wenig Sinn, da die Addition von Hashwerten zu vieldeutig ist.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Moonlight

Registriert seit: 16. Aug 2004
11 Beiträge
 
#5

Re: Md5

  Alt 27. Aug 2004, 15:53
Ok, danke! Werde das wohl mal versuchen.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Md5

  Alt 27. Aug 2004, 17:52
Mit dem DEC

Delphi-Quellcode:
function CalcHashs(const Strings: TStrings): String;
begin
  with THash_MD4.Create do
  try
    Init;
    for I := 0 to Strings.Count -1 do
      Calc(PChar(Strings[I])^, Length(Strings[I]));
    Done;
    Result := StrToFormat(DigestKey, DigestKeySize, fmtHEX);
  finally
    Free;
  end;
end;
Du musst also NICHT umständlich alle Hashwerte in einem String zusammenfassen, sondern es reicht einHash Object einmalig zu initialisieren, danach alle Hashs sequentiuell zu übergeben, und am Ende per .Done die Aktion zu beenden. Dies ist wesentlich effizienter und ergibt am Ende den gleichen Hash über alle Werte als wenn man sie in einem String zusammengefasst hätte.

Die Hashs über deine Dateien kannste im DEC so berechenen:

  Result := THash_MD4.CalcFile('c:\deinedatei.bin', nil, fmtHEX); Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#7

Re: Md5

  Alt 27. Aug 2004, 18:54
ja natürlich kann man alles in einem rutsch hashen, aber wenn dann unterschiedliche werte rauskommen, muss man danach nochmal alle dateien checken, um rauszufinden, welche die schuldige ist. wenn man vorher alle hasht, kann man daraus den gesamthash berechnen und danach eventuell auf die alten resultate zurückgreifen.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: Md5

  Alt 29. Aug 2004, 12:59
@nailor,

Von "Zusammenfassen" wie du es interpretierst redet doch keiner.

Schau dir mein obiges Posting nochmal genauer an, es geht nicht darum gleich aus den Dateien die Hashs zu erzeugen und alle gemeinsam zu hashen.
Sondern wir haben schon alle Hashwerte über die Dateien, Zb. in einer StringList oder so. Nun ging es darum daraus einen einzigen Master-Hash zu bauen. Zwei Lösungsvorschläge wurden gemacht:
1.) aus diesen kurzen Strings einen langen zu bauen und diesen String dann zu hashen.
2.) die Hashwerte gleich sequentiell einzeln der hash-Funktion zu übergeben, mein Vorschlag

So, bei 100000 Dateien würde also Vorschlag 1.) erstmal 100000 mal einen String aus kurzen Strings zusammenbauen und danach erst einmalig Hashen, es werden also inm jedem Fall 100000 Speicherkopierungen nötig, mal abgesehen von den vielen Süeicherreallokationen des langen Strings durch die RTL. Das Resultat wird bei beiden Vorschlägen identisch sein, die Geschwindigkeit der hashfunktion sollte bei beiden Vorschlägen gleich sein, nur eben das Zusammenbauen des langen Strings in Vorschlag 1.) sollte man auf keinen Fall zeitlich unterschätzen. Gerade darin besteht der Unterschied der beiden Vorschläge.

Nun erkennst du das das rein garnichst mit der Notwendigkeit die Dateien zweimal hashen zu müssen, zu tun hat.
Sondern eher von mir ein Hinweis darauf war das eine gute Hash Implementation viele Speicherbeeiche so hashen kann als wären sie in einem Speicherbereich sequentiell zusammengefasst. Somit besteht nicht im geringsten die Notwendigkeit die Datei-Hash-Werte vor dem gemeinsammen Hashen erst als ein String zusammenzubauen. Dieser Schritt ist nicht notwendig und reduziert die Performance erheblich. (zudem zeugt sie davon das derjenige wenig über das Verhalten von Hashfunktionen weis).

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#9

Re: Md5

  Alt 29. Aug 2004, 14:01
Hast Recht. Hatte dich nur so verstanden, dass du NUR den Master-Hash berechnen willst. Und dagegen hatte ich protestiert.

Wenn man jetzt alle Einzel-Hashes hat und den Master-Hash berechnen will ist es halt nur eine Performance und Programmieraufwandfrage, wie man das macht. Das mit den Strings wäre wahrscheinlich am schnellsten hingekleistert, wohingegen das mit den Rohdaten natürlich sauberer wäre.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Md5

  Alt 29. Aug 2004, 14:22
Ich hab auch sowas, allerdings sind dort 2 Dateien mit den Hash's auf'm Server
eine mit den Hash's der einzelnen Dateien und eine mit den ein paar anderen Versionsinfos und dem Hash der 1. Datei - ich hatte die 2. Datei aber anfangs nur zur Kontolle der Ersten. Damit ich auch 'ne Kontrolle hatte, ob die Erste auch in Ordnung ist.

Den vergleich hatte aber nicht der Server, sondern das Programm selber gemacht.



Also ich hab einfach die Hashdatei nochmal gehasht, aber es ist doch auch möglich die Hash's als Strings der Reihe nach zu hashen?

meistens gibt es doch Funktionen MD5Init, MD5Update und MD5Final...


Delphi-Quellcode:
    Var MD5Hashs: Array of String;

    Type MD5Digest = Array[0..15] of Byte;
      ...

    Var Context: MD5Context;
      Digest: MD5Digest;

    Begin
      MD5Init(Context);
      For i := 0 to Length(MD5Hashs) - 1 do
        MD5Update(Context, PChar(MD5Hashs[i]), Length(MD5Hashs[i]));
      MD5Final(Context, Digest);
      ...
    End;
die 16 Bytes in Digest müssen dann nurnoch der Reihe nach in Hexadezimalverte umgewandelt werden, oder so ähnlich

[add]
wobei zu bedenke ist, wenn man die Rohdaten zusammenhasht, dann kommt mit Sicherheit eine anderer Masterhash raus, als wenn man die Stringwerte verwendet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:23 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