Delphi Can
Özetleme Fonksiyonları (Hash Function) - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: İpuçları (https://www.delphican.com/forumdisplay.php?fid=24)
+--- Konu Başlığı: Özetleme Fonksiyonları (Hash Function) (/showthread.php?tid=3116)



Özetleme Fonksiyonları (Hash Function) - narkotik - 06-01-2019

Hash function Nedir?(Sadi Evren) 

Hash fonksiyonu ile ilgili delphide bir örnek hazırladım, meraklısı için ;

Sample Link

 const MAX_ROW = 10; // Hash tablomuz maximum satır sayısı

type
  ROW     = ^TROW; // Satır bağlı listemiz
  TRow    = record
  Index   : Integer;
  Numara  : Integer;
  Sonraki : ROW;
end;

type
  HASH_TABLE  = ^THASH_TABLE; // Hash Tablomuz
  THASH_TABLE = record
  ROWS        : Array of ROW;
end;

var
 Form1: TForm1;
 xHASH_TABLE : HASH_TABLE;
implementation

{$R *.dfm}

procedure Baslangic_Deger_Ata;
begin
 Var Ind : Integer;
 for Ind := Low(xHASH_TABLE.ROWS) to High(xHASH_TABLE.ROWS) do
 begin
   New(xHASH_TABLE.ROWS[Ind]);
   xHASH_TABLE.ROWS[Ind]^.Index   := -1; // Boş olup olmadığı kontrol edilebilir.
   xHASH_TABLE.ROWS[Ind]^.Numara  := -1;
   xHASH_TABLE.ROWS[Ind]^.Sonraki := nil;
 end;
end;

procedure Ekle(ANumara:Integer);
begin
 Var xRow  : ROW;
 Var Adres : Integer;
 Adres := ANumara mod MAX_ROW;

 if xHASH_TABLE.ROWS[Adres].Index = -1 then // Hash tablosunda ilgili satır boş ise
 begin
   xHASH_TABLE.ROWS[Adres]^.Index  := Adres;
   xHASH_TABLE.ROWS[Adres]^.Numara := ANumara;
 end
 else // Bağlı liste mantığında sona eklenecek, Collision(Çarpışma)
 begin
   New(xRow); //Bağlı listede yeni alan açıldı
   if xRow = nil then // Ramde alan kalmadı, düşük ihtimal
   begin
     Application.MessageBox(PCHAR('Ram''de alan kalmadı'),PCHAR('UYARI'),MB_OK);
     Exit;
   end
   else
   begin
     xRow^.Index   := Adres;
     xRow^.Numara  := ANumara;
     xRow^.Sonraki := nil;

     Var xTemp : ROW;
     xTemp := xHASH_TABLE.ROWS[Adres];
     while xTemp^.Sonraki <> nil do // Satırdaki son elemana kadar gittik
       xTemp := xTemp^.Sonraki;
     xTemp^.Sonraki := xRow;
   end;
 end;
end;

procedure Listele(AMem:TMemo);
begin
 AMem.Lines.Clear;
 Var xTemp : ROW;
 Var Ind   : Integer;
 Var Ind2  : Integer;

 for Ind := Low(xHASH_TABLE.ROWS) to High(xHASH_TABLE.ROWS) do
 begin
   AMem.Lines.Add(Format('%d. Satıra İlk değer %d',[Ind,xHASH_TABLE.ROWS[Ind]^.Numara]));
   xTemp := xHASH_TABLE.ROWS[Ind].Sonraki;
   Ind2  := 2;
   while xTemp <> nil do
   begin
     AMem.Lines.Add(Format('%d Satıra %d. değer %d',[Ind,Ind2,xTemp^.Numara]));
     xTemp := xTemp^.Sonraki;
     Inc(Ind2);
   end;
   AMem.Lines.Add('-------------------------');
 end;
end;

function Ara(ANumara:Integer):ROW;
begin
 Var xTemp : ROW;
 Var Adres : Integer;
 Adres  := ANumara mod MAX_ROW;
 Result := nil;
 if xHASH_TABLE.ROWS[Adres].Index <> -1 then // Tabloda varsa
 begin
   xTemp := xHASH_TABLE.ROWS[Adres];
   while xTemp <> nil do
   begin
     if xTemp^.Numara = ANumara then
     begin
       Result := xTemp;
       Break;
     end;
     xTemp := xTemp^.Sonraki;
   end;
 end;
end;

procedure TForm1.BtnHashAraClick(Sender: TObject);
begin
 Var Aranan : ROW;
 Aranan := Ara(22);
 if Aranan <> nil then
   ShowMessage('Buldum')
 else
   ShowMessage('Bulamadım');
end;

procedure TForm1.BtnHashClick(Sender: TObject);
begin
 //İlk İşlemler
 New(xHASH_TABLE);
 SetLength(xHASH_TABLE^.ROWS,MAX_ROW);
 Baslangic_Deger_Ata;

 Ekle(1); //  Üçü aynı satırda
 Ekle(11);
 Ekle(21);

 Ekle(2);
 Ekle(12); // İkisi aynı satırda

 Ekle(3); //  İkisi aynı satırda
 Ekle(13);

 Listele(memHashTable); // Listele
end;