Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is an example of a Hashtable implementation in C#?

Tags:

c#

.net

hashtable

I realize C# and .NET in general already has the Hashtable and Dictionary classes.

Can anyone demonstrate in C# an implementation of a Hashtable?

Update: To clarify, I'm not ncessarily looking for a complete implementation, just an example of the core features of a hashtable (i.e. add,remove, find by key).

like image 938
Arec Barrwin Avatar asked Mar 09 '09 12:03

Arec Barrwin


People also ask

What is hash table with example?

Hash Table is a data structure which stores data in an associative manner. In a hash table, data is stored in an array format, where each data value has its own unique index value. Access of data becomes very fast if we know the index of the desired data.

How do you implement Hashtable?

Take an array and use the hash function to hash the 26 possible characters with indices of the array. Then iterate over S and increase the value of the current character of the string with the corresponding index for each character. The complexity of this hashing approach is O(N), where N is the size of the string.

What is a Hashtable in C?

Advertisements. Hash Table is a data structure which stores data in an associative manner. In hash table, the data is stored in an array format where each data value has its own unique index value. Access of data becomes very fast, if we know the index of the desired data.


1 Answers

Long after the question has been asked, so I don't expect to earn much rep. However I decided it would be fun to write my own very basic example (in less than 90 lines of code):

    public struct KeyValue<K, V>     {         public K Key { get; set; }         public V Value { get; set; }     }      public class FixedSizeGenericHashTable<K,V>     {         private readonly int size;         private readonly LinkedList<KeyValue<K,V>>[] items;          public FixedSizeGenericHashTable(int size)         {             this.size = size;             items = new LinkedList<KeyValue<K,V>>[size];         }          protected int GetArrayPosition(K key)         {             int position = key.GetHashCode() % size;             return Math.Abs(position);         }          public V Find(K key)         {             int position = GetArrayPosition(key);             LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);             foreach (KeyValue<K,V> item in linkedList)             {                 if (item.Key.Equals(key))                 {                     return item.Value;                 }             }              return default(V);         }          public void Add(K key, V value)         {             int position = GetArrayPosition(key);             LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);             KeyValue<K, V> item = new KeyValue<K, V>() { Key = key, Value = value };             linkedList.AddLast(item);         }          public void Remove(K key)         {             int position = GetArrayPosition(key);             LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position);             bool itemFound = false;             KeyValue<K, V> foundItem = default(KeyValue<K, V>);             foreach (KeyValue<K,V> item in linkedList)             {                 if (item.Key.Equals(key))                 {                     itemFound = true;                     foundItem = item;                 }             }              if (itemFound)             {                 linkedList.Remove(foundItem);             }         }          protected LinkedList<KeyValue<K, V>> GetLinkedList(int position)         {             LinkedList<KeyValue<K, V>> linkedList = items[position];             if (linkedList == null)             {                 linkedList = new LinkedList<KeyValue<K, V>>();                 items[position] = linkedList;             }              return linkedList;         }     } 

Here's a little test application:

 static void Main(string[] args)         {             FixedSizeGenericHashTable<string, string> hash = new FixedSizeGenericHashTable<string, string>(20);              hash.Add("1", "item 1");             hash.Add("2", "item 2");             hash.Add("dsfdsdsd", "sadsadsadsad");              string one = hash.Find("1");             string two = hash.Find("2");             string dsfdsdsd = hash.Find("dsfdsdsd");             hash.Remove("1");             Console.ReadLine();         } 

It's not the best implementation, but it works for Add, Remove and Find. It uses chaining and a simple modulo algorithm to find the appropriate bucket.

like image 146
RichardOD Avatar answered Oct 05 '22 06:10

RichardOD