![]() |
Md5
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 |
Re: Md5
such dir ne compo, die strings hashen kann (
![]() allerdings sollte es kein problem sein, 5000 hashes zu verschicken, 5000 * 32 byte = 160kb, plus ein bisschen overhead... |
Re: Md5
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... :?: |
Re: Md5
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.
|
Re: Md5
Ok, danke! Werde das wohl mal versuchen. :)
|
Re: Md5
Mit dem DEC
Delphi-Quellcode:
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.
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; Die Hashs über deine Dateien kannste im DEC so berechenen:
Delphi-Quellcode:
Gruß Hagen
Result := THash_MD4.CalcFile('c:\deinedatei.bin', nil, fmtHEX);
|
Re: Md5
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.
|
Re: Md5
@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 |
Re: Md5
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. |
Re: Md5
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:
die 16 Bytes in Digest müssen dann nurnoch der Reihe nach in Hexadezimalverte umgewandelt werden, oder so ähnlich
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; [add] wobei zu bedenke ist, wenn man die Rohdaten zusammenhasht, dann kommt mit Sicherheit eine anderer Masterhash raus, als wenn man die Stringwerte verwendet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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