Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hashen!!! Wie??? (https://www.delphipraxis.net/9926-hashen-wie.html)

ATwardz 7. Okt 2003 21:21


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:
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;
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!

Delphi-Quellcode:
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.
Da ich bis vor kurzen rein garnichts vom Hashen wusste, wäre ich sehr dankbar für jede Hilfestellung!

DAnke im Vorraus!

aMuTeX 8. Okt 2003 10:01

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:
http://www.cobans.net/hashlib.html

Ich hoffe das hilft dir soweit.

ATwardz 8. Okt 2003 12:43

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!

ATwardz 9. Okt 2003 23:33

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

aMuTeX 10. Okt 2003 09:46

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 Bei Google suchenhash md5 sha vergleich. Die Wahl hängt von deinem Einsatzzweck ab. Ich denke um Dateien zu vergleichen sollte MD5 geeignet sein.

Dark-Angel 13. Dez 2003 15:28

Re: Hashen!!! Wie???
 
Hash-Algos für Delphi findest du z.B. hier:
http://www.cobans.net/hashlib.html

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.
http://www.cobans.net/hashlib.php

[/EDIT]

negaH 13. Dez 2003 18:22

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:

  ResultAsHEXString := THash_M5.CalcFile('c:\Myfile.bin', nil, fmtHEX);
mehr nicht.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 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