Hash Table’ı .NET’de istediğimiz zaman arkaplanını bilmeden sınırsız ve kolay bir şekilde kullanabiliriz. Arkaplanını çok bilmememiz gerekmiyor. Bizim de 3. sınıf derslerimizden “CENG 351 Data Management and File Structure”' ın dönem projesinde Bucket Hashing’i C / C++ da geliştirdik. Bucket boyutu olarak 2 alıp , artanları overflow area’da depoladık. Hash function olarak ise mod 100 kullandık sonuçları daha rahat görebilmemiz için. Aşağıda güzel bir java appletinden ekran görüntüsü alıp örnek veriler ekleyip olayın mantığını göstermeye çalışacağım. Siz de o sayfada aşağıdan gerekli ayarları yaptıktan sonra kendi verilerinizle test edebilirsiniz.

Bucket boyutumuz 2 olduğu için key değeri mod 100’e göre object , key’lerden 2’şer tane sol tarafta tutabiliriz. Örneğin üstteki ekran görüntüsüne göre 3401 ve 9101 key ‘lerini value’larıyla beraber sol tarafta tutabiliriz. Mod 100 ‘ e göre 3. bir key gelirse overflow area’ya sırayla kayıt edilmesi gerekiyor. Örneğin 5701 ve 4501.
Projede verilerimiz bir struct’da bir çalışanın adı , soyadı , id’si , maaşı gibi bilgiler saklıyoruz. Hash Table’daki key’imiz burda çalışan kişinin id’si. Böylece çalışanın sadece id’lerini tutarak bütün çalışan kayıtlarını index’lemiş olup diğer yöntemlere göre çok daha hızlı istediğimiz kayıda ulaşabiliyoruz. Value ise bütün bilgilerin saklandığı adresi tutuyor fakat adres memory’deki adresi değil , bütün kullanıcıların tamamının bilgileri olduğu bir binary dosyada’da ilgili kayıdın dosyanın başına göre kaçıncı kayıtta olduğunu tutuyorum.
C++’ da konsol uygulaması olarak geliştirdim. Program ilk çalıştığında gelen ekranı üst tarafta görebilirsiniz. Programın özelliklerinden biri Hash Table’ı memory’ye yazmak yerine bir dosya üzerine kaydedip , Hash Table’ı “Load Last Session” a girerek bir önceki Hash Table’ı getirebilirsiniz. Tabiki bütün bilgilerin olduğu binary dosya da Hash Table ‘ a göre güncel kalıyor. Diğer seçenekler ise örnek veriler ve ona göre Hash Table yaratmak veya herşeyi sıfırdan yaratabilmek.
Üstteki ekran görüntüsü programın bütün fonksiyonlarını gösteriyor. Çalışanın ID’sine göre Hash Table’da çok hızlı bir arama yapıp ( eğer bucket’ların içinde kayıtlıysa 1 veya 2 adımda istediğimiz value’ya ulaşacağız fakat kayıt overflow area’da ise linked list’in boyutuna göre değişir. ) kaç dosya erişimi kullanarak ulaştığını gösteriyor. ( “found in 2 file access” ) Aşağıdaki ekran görüntüsünde arama yapıp çalışanın bilgilerini ( rastgele anlamsız doldurduğum ) getiriyor.
Aşağıdaki ekran görüntüsünde de kayıt ekleme kısmını gösterim. Program açıkça nereye kaydettiğini gösteriyor. Aşağıda id’si 2387 olan çalışanı mod 100 e göre 87. alanda ilk bucket önceden dolmuş olduğu için boş olan ikinci bucket’a yerleştiriyor.
Son olarak da binary dosyada kayıtların nasıl kayıtlı olduğunu , hast table da bucket olarak nasıl tutulduklarını ve overflow area’yı göstermek istiyorum. Bir önceki basamakta id’si 2387 olup adı Alp olan çalışana dikkat ediniz. İlk ekran görüntüsünde bütün kayıtlar dosyadan gösteriliyor. Eklediğim kayıt en sona yerleşmiş durumda ve dosyadaki sırası 51.
Alttaki ekran görüntüsünde hash table bucket ‘ larını gösteriyorum. 99’a kadar sıralı olduğuna dikkat ediniz. 87’nin 2. bucket’ında en son kaydettiğimiz veriyi görebilirsiniz. [ Key : 2387 Value : 51 ] Eğer 2387 key’ini aratırsak bize 51 sonucu dönecektir. Verilerin hepsinin kayıtlı olduğu binary dosyadan da 51 kayıt ileriye tek adımda ulaşarak istediğimiz bilgilere ulaşabiliyoruz.
Alttaki ekran görüntüsünde ise overflow area’mız var linked list ile yaptığım. Alttaki ve üstteki ekran görüntüsündeki 1 ve 0 lar kayıdın silinip silinmediğini gösteren bir flag diyebiliriz. Tamamen silemeyiz çünkü dosya üzerindeki sırayı bozmuş oluruz. Bozarsak da bucket’daki ve overflowdaki value’lar bizi yanlış kayıtlara götürecektir. Silinen kayıtları 0 olarak işaretleyip , üzerine kayıt eklenebilir şeklinde ayarlama yaptım.
