Commit 53434ee

mo khan <mo.khan@gmail.com>
2020-08-03 19:42:14
Write mini hash table in ruby
1 parent 39450f0
Changed files (1)
src
02
src/02/04/hash.rb
@@ -0,0 +1,61 @@
+class List
+  attr_reader :next, :data
+
+  def initialize(data)
+    @data = data
+  end
+
+  def add(data)
+    if self.next
+      self.next.add(data)
+    else
+      @next = self.class.new(data)
+    end
+  end
+
+  def search(&block)
+    return self if block.call(data)
+
+    @next&.search(&block)
+  end
+end
+
+class MHash
+  def initialize(size = 13)
+    @size = size
+    @buckets = Array.new(size)
+  end
+
+  def [](key)
+    bucket = bucket_for(key)
+    node = @buckets[bucket]
+    return if node.nil?
+
+    found = node.search do |item|
+      item[0] == key
+    end
+    return found.data[-1] if found
+  end
+
+  def []=(key, value)
+    bucket = bucket_for(key)
+    if @buckets[bucket]
+      @buckets[bucket].add([key, value])
+    else
+      @buckets[bucket] = List.new([key, value])
+    end
+  end
+
+  private
+
+  def bucket_for(key)
+    key % @size
+  end
+end
+
+h = MHash.new
+h[8] = 'hello'
+h[21] = 'jello'
+
+puts [8, h[8]].inspect
+puts [21, h[21]].inspect