![]() |
Hashen!!! Wie???
Als ich habe ein Programm was Dateien vergleicht, damit dieses nicht zu langsam wird wurde mir gesagt das ich eine Hash-table anlegen soll!
Nun meine simple Frage kann mir jemand mal etwas dazu erklären! HAbe diesen Code im Internet gefunden, blicke jedoch nicht ganz durch wie ich meine Procedure Arefilesequal,
Delphi-Quellcode:
mit diesem Code in verbindung setzen kann oder bin ich da auf dem Holzweg? Im Forum habe ich nichts gefunden und im bei google keine befriedigende Erklärung!
Function AreFilesEqual( Const file1, file2: String ): Boolean;
Var m1, m2: TMemoryStream; Begin Result := False; m1 := TMemoryStream.Create; try m1.LoadFromFile( file1 ); m2:= TMemoryStream.Create; try m2.LoadFromFile( file2 ); If m1.size = m2.size Then Result := CompareMem( m1.Memory, m2.memory, m1.size ); finally m2.free; end; finally m1.free; end End;
Delphi-Quellcode:
Da ich bis vor kurzen rein garnichts vom Hashen wusste, wäre ich sehr dankbar für jede Hilfestellung!
program hash1_2;
uses simpleHash in 'simpleHash.pas'; const cHexChars: array [0..15] of char = '0123456789abcdef'; cNullStr: PChar = '00000000'; function hexStr(i: cardinal): string; var n: integer; begin if i=0 then result:='0' else begin setString(result,cNullStr,8); n:=8; while (i>0) do begin result[n]:=cHexChars[i and $f]; i:=i shr 4; dec(n); end; for n:=1 to 8 do if result[n]<>'0' then begin delete(result,1,n-1); exit; end; end; end; var h: TStringHash; n, Count, i: cardinal; code: integer; s: string; begin n :=1; if ParamCount=1 then Val(ParamStr(1),n,code); h:=TStringHash.Create; for i:=1 to n do h.add(hexStr(i),i); count:=0; for i:=1 to n do begin str(i,s); if h.get(s)<>nil then inc(Count); end; h.Destroy; writeln(Count); end. DAnke im Vorraus! |
Re: Hashen!!! Wie???
Hallo ATwardz
Also ein Hash ist ein eindeutiger Wert für eine Datei oder einen String oder ähnliches. Es gibt verschiedene Alogrithmen welche diesen Hash-Wert aus der Datei erzeugen (MD5, SHA... oder dein SimpleHash). Es ist sehr unwahrscheinlich das zwei verschiedene Dateien denselben Hash ergeben. Zudem ist die ganze Sache nur in eine Richtung machbar. Also vom Hash-Wert lässt sich die Quelle nicht erzeugen aber ein und dieselbe Quelle ergibt immer den selben Hash-Wert. Um nun Dateien zu vergleichen gibts eben zwei Möglichkeiten: 1. Du vergleichst die Dateien Bit für Bit (so wie bei deiner Funktion AreFilesEqual) 2. Du vergleichst den Hash-Wert der Dateien. Die Hash-Werte kannst du natürlich in einer Tabelle speichern damit die Werte nicht jedesmal neu aus den Dateien gebildet werden müssen. Der Hash-Algo braucht natürlich auch eine gewisse Zeit (abhängig vom Algo) aber meist weniger als ein BinaryCompare. Hash-Algos für Delphi findest du z.B. hier: ![]() Ich hoffe das hilft dir soweit. |
Re: Hashen!!! Wie???
Ja vielen Danke erstmal,
ich habe es zwar noch nicht ausprobiert aber weiss wenigstens wie es funkst. und denke das ich das hinbekomme! DAnke @wardz! |
Re: Hashen!!! Wie???
Ja DAnke das hat es gebracht, mein Programm ist fertig!
eine Frage hätte ich noch die Verschiedenen Hasarten unterscheiden sich ja in der Länge des HAshstrings, welcher Typ ist den für welche Aufgabe am sinnvollsten? z.B. ist Adler32 sehr kurz, steigt dann auch die Wahrscheinlichkeit das zwei unterschiedliche Dateien den gleichen HAshstring ergeben? Ansonsten ne klasse Geschichte Danke nochmals @wardz |
Re: Hashen!!! Wie???
Die verschiedenen Hash Algos unterscheiden sich in Geschwindigkeit und Sicherheit. Typischerweise braucht ein sicherer Algo länger. Wie sicher und wie schnell die einzelnen Algos sind findest du hier
![]() |
Re: Hashen!!! Wie???
Hash-Algos für Delphi findest du z.B. hier:
![]() Hilfe die Adresse geht nicht mehr hat jemand die lib ma für mich? [EDIT] Hmm hab es selber schon gefunden die neue Addy ist. ![]() [/EDIT] |
Re: Hashen!!! Wie???
Vielleicht solltest du auch mal das DEC = Delphi Encryption Compendium anschauen.
Was ich bisher von obiger HashLib sehen konnte ist das sie einerseits ziemlich unoptimierten Source enthält und somit um einiges langsammer als das DEC ist. Und andererseits ist das Interface zum erzeugen eines Hashes viel zu kompliziert. Als vergleich im DEC erzeugst du so einen Hash einer Datei:
Delphi-Quellcode:
mehr nicht.ResultAsHEXString := THash_M5.CalcFile('c:\Myfile.bin', nil, fmtHEX); Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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