Hashtable Sınıfı

Hashtable Sınıfı

Hashtable da System.Collections namespace’inde bulunan diğer sınıflar gibi kendi ismi ile anılan veri yapısı ve algoritmayı enkapsüle eder. Hashtable sınıfının detaylarına geçmeden önce, bu veri yapısı üzerinde kısaca durmanın konuyu anlamak bakımından yararlı olacağını düşünüyorum.

NOT : Hashtable veri yapısı ya da “hashing” algoritmaları, üzerine onlarca kitap yazılmış ve başlı başlına incelenmesi gereken detaylı bir konudur. Burada yapılmak istenen, konuya ilişkin temel bilgilerin detaya inilmeksizin okuyucuya kazandırılmasıdır. 

Hashtable veri yapısında, elemanlar özgün birer “anahtar-değer çifti” şeklinde bellekte saklanırlar. Terminolojide anahtar-değer çiftlerinin saklandığı yapı; “hash tablosu” olarak bilinir. Hash tablosuna yeni bir eleman eklendiği zaman, anahtar bilgisinden özel bir algoritma ile hash kodu elde edilir. Hash kodunun elde edilişi, “hash fonksiyonu” ile sağlanır. Sofistike olmayan durumlar için, hash fonksiyonun çalışma prensibi; tablo büyüklüğü ile uygulanan mod alma işlemidir. Bu işlem sonucunda elde edilen değer, anahtar bilgisinin indisi olacaktır. Örneğin beş elemanlı tabloya eklenen (1, 2, 64) anahtar değerleri için;

1 mod 5 = 1

“1” anahtar değeri 1. hücrede

2 mod 5 = 2

“2” anahtar değeri 2. hücrede

64 mod 5 = 4

“64” anahtar değeri 4.hücrede

Bu durumda hash fonksiyonunun genel biçimi; “h(key) = key mod size” şeklindedir.

Hashtable sınıfı, anahtar bilgisi olarak herhangi bir nesnenin kullanımına imkan tanır. Aslında fiziksel olarak, Hashtable sınıfı ile oluşturulan veri yapısı; DictionaryEntry yapısı türünden nesneleri saklar. Bu durumda Hashtable sınıfı ile oluşturulan veri yapısını görsel olarak şöyle gösterebiliriz;

Hashtable sınıfı , anahtara ait hash kodu bilgisini anahtar olarak kullanılan nesnenin GetHashCode() fonksiyonundan sağlar. Bildiğiniz gibi, .NET Framework’teki her nesne, object sınıfından türetilmiştir ve GetHashCode() fonksiyonunu miras alır.

Hashtable veri yapısına ait bilindik bir sorun çakışmalardır (collision). Çakışma, birden fazla anahtarın, tablodaki aynı hücre ile ilişkilendirilmesi durumunda oluşur. Hashtable sınıfı, bu sorunu belirli bir ölçüde önlemek amacıyla, “double hashing” algoritmasını kullanır. Ancak bazı durumlarda çakışmaların önüne tümüyle geçilemez.

Hashtable veri yapısınının performans optimizasyonu üzerinde iki faktör etkilidir; tablo büyüklüğü ve anahtar olarak kullanılan nesneden elde edilen hash kod bilgisinin tekilliği. Bu nedenle, tablonun oluşturulması aşamasında doğru büyüklüğün belirlenmesi önemlidir. Her ne kadar Hashtable’ın büyüklüğü otomatik artım yeteneğine sahipse de, bu tür işlemlerin yapılışı belirli bir zaman almaktadır.

Oluşturulan Hashtable’ın, performans ve bellek tüketimi karakteristiklerinin dengelenmesinde, yükleme faktörünün (load factor) doğru seçilmiş olması da önemli bir unsurdur. Yükleme faktörü, tablodaki geçerli eleman sayısının, tablo büyüklüğüne oranı olarak tanımlanabilir. Varsayılan değeri (1.0) olan yükleme faktörüne (0.1 – 1.0) aralığında değerler verilerek, hız ve bellek tüketimi dengelenebilir. Ancak standart uygulamalar için, default değerinin kullanımı önerilmektedir. < /P >

Hashtable Yapısının Oluşturulması

Bellekte Hashtable yapısında ve uygun büyüklükte bir bölgenin tahsisi, Hashtable sınıfına ait constructor’ın kullanımı sayesinde, nesne yaratılması sırasında otomatik olarak sağlanır. Hashtable sınıfında onbir farklı overload versiyonu bulunan constructor vardır, ancak burada en sık kullanılan versiyonlar üzerinde durulmuştur.

Public Sub New()

Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, bellekte default olarak belirlenmiş büyüklük (0 eleman) ve yükleme faktörüne (1.0), sahip bir Hashtable yapısını oluşturur.

Public Sub New(ByVal capacity as Integer)

Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, bellekte fonksiyonun parametresinde belirlenen büyüklükte bir Hashtable yapısını oluşturur.

Public Sub New(ByVal d as IDictionary)

Bu versiyon kullanılarak türetilen bir Hashtable nesnesi, fonksiyonun parametresinde belirlenen kolleksiyonun elemanlarını kopyalarak, bir Hashtable yapısı oluşturur. 

Hashtable Yapısı Üzerinde İşlemler

Hashtable yapısı üzerinde eleman ekleme, silme, bulma gibi işlemler; Hashtable sınıfına ait üyeler kullanılarak gerçekleştirilir.

Count Propertysi : Hashtable’ın eleman sayısını tutar.

Public Overridable Property Count As Integer Implements ICollection.Count

Item Property’si : Parametresine anahtar bilgisi girilen elemanı temsil eder. Set ve Get işlemlerinde kullanılır.

Default Public Overridable Property Item(ByVal key As Object) As Object

Keys Property’si : Bu property Hashtable içerisindeki anahtar bilgilerini içeren, ICollection türündeki bir kolleksiyondur.

Public Overridable ReadOnly Property Keys As ICollection

Values Property’si : Bu property Hashtable içerisindeki değer bilgilerini içeren, ICollection türündeki bir kolleksiyondur.

Public Overridable ReadOnly Property Values As ICollection

Add() Metodu : Parametresine anahtar ve değer bilgileri girilen elemanı tabloya ekler. Eklenen eleman için, anahtar bilgisi kesinlikle null referans olamaz, ancak değer null olabilir. Hashtable’a null referans içeren bir anahtarın eklenmesi, ArgumentNullException oluşmasına neden olur.

Ayrıca belirlenen anahtar bilgisinin tablo içerisinde önceden bulunmaması ve tekil olması gerekir. Hashtable’a daha önceden eklenmiş bir anahtarın tekrar eklenmesi, ArgumentException oluşmasına neden olur. Public Overridable Sub Add( _     ByVal key as Object,

    ByVal value as Object) Implements IDictionary.Add

Sabit uzunluktaki ya da salt okunur Hashtable yapıları için Add() metodunun kullanımı NotSupportedException oluşmasına neden olur.

Remove() Metodu : Parametresine anahtar bilgisi girilen elemanı Hashtable’dan çıkartır.

Public Overridable Sub Remove( _

    ByVal key as Object,

) Implements IDictionary.Remove

Sabit uzunluktaki ya da salt okunur Hashtable yapıları için Remove() metodunun kullanımı NotSupportedException oluşmasına neden olur.

Contains() Metodu : Parametresine anahtar bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner.

Public Overridable Function Contains( ByVal key as Object) as Boolean Implements IDictionary.Contains

ContainsKey() Metodu : Parametresine anahtar bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner.

Public Overridable Function ContainsKey( ByVal key as Object) as Boolean

ContainsValue() Metodu : Parametresine değer bilgisi girilen elemanı, Hashtable içerisinde arar. Fonksiyon aradığı elemanı tabloda bulursa true ile, bulamazsa false değeri ile döner.

Public Overridable Function ContainsValue( ByVal value as Object) as Boolean

Clear() Metodu: HashTable’ın içeriğini tamamen yok eder.

Public Overridable Sub Clear() Implements IDictionary.Clear

Örnek :

Aşağıdaki uygulamada haftanın günleri türkçe ve ingilizce olarak “oHtb” isimli nesne ile temsil edilen Hastable’a eklenmiştir. Daha sonra Item property’si kullanılarak, anahtar bilgisi girilen elemanın değer bilgisinin alınışı örneklenmiştir.

Sub Main()

    Dim oHtb As Hashtable

    oHtb = New Hashtable(7)

    oHtb.Add("Pazartesi", "Monday")

    oHtb.Add("Salı", "Tuesday")

    oHtb.Add("Çarşamba", "Wednesday")

    oHtb.Add("Perşembe", "Thursday")

    oHtb.Add("Cuma", "Friday")

    oHtb.Add("Cumartesi", "Saturday")

    oHtb.Add("Pazar", "Sunday")

    Console.WriteLine("Salının ingilizcesi:" & oHtb.Item("Salı"))

End Sub

Döküman Arama

Başlık :

Kapat