Ö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; |