AGB  ·  Datenschutz  ·  Impressum  







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

Hashen!!! Wie???

Ein Thema von ATwardz · begonnen am 7. Okt 2003 · letzter Beitrag vom 13. Dez 2003
Antwort Antwort
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#1

Hashen!!! Wie???

  Alt 7. Okt 2003, 22:21
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]<>'0then 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!
  Mit Zitat antworten Zitat
aMuTeX

Registriert seit: 8. Mai 2003
Ort: Luzern
54 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Hashen!!! Wie???

  Alt 8. Okt 2003, 11:01
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.
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#3

Re: Hashen!!! Wie???

  Alt 8. Okt 2003, 13:43
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!
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#4

Re: Hashen!!! Wie???

  Alt 10. Okt 2003, 00:33
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
  Mit Zitat antworten Zitat
aMuTeX

Registriert seit: 8. Mai 2003
Ort: Luzern
54 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Hashen!!! Wie???

  Alt 10. Okt 2003, 10:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dark-Angel
Dark-Angel

Registriert seit: 1. Okt 2003
4 Beiträge
 
#6

Re: Hashen!!! Wie???

  Alt 13. Dez 2003, 16:28
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]
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Hashen!!! Wie???

  Alt 13. Dez 2003, 19:22
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
  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 20:32 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