Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Özetleme Fonksiyonları (Hash Function)
#1
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;
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Örnek Delphi x64 Inline Assemblier Fonksiyonları PROGRAMADOR35 11 5.091 10-08-2021, Saat: 12:46
Son Yorum: maroonka
  utf8<-->unicode dönüşüm fonksiyonları. PROGRAMADOR35 0 826 02-01-2021, Saat: 07:00
Son Yorum: PROGRAMADOR35
  Bazı Çeviri Fonksiyonları Unit dosyası adelphiforumz 4 3.695 31-12-2017, Saat: 20:27
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi