input: Write a python function to implement a hash table with insert, retrieve, and delete methods.
  assert __name__ == "__main__":
      ht = HashTable()
      ht.insert("key1", "value1")
      assert ht.retrieve("key1") == "value1"
      ht.insert("key2", "value2")
      assert ht.retrieve("key2") == "value2"
      ht.insert("key1", "new_value1")
      assert ht.retrieve("key1") == "new_value1"
      ht.delete("key1")
      assert ht.retrieve("key1") == None
output: class HashTable:
      def __init__(self, size=100):
          self.size = size
          self.table = [None] * size
      
      def _hash(self, key):
          return hash(key) % self.size
      
      def insert(self, key, value):
          index = self._hash(key)
          if self.table[index] is None:
              self.table[index] = []
          for i, (k, v) in enumerate(self.table[index]):
              if k == key:
                  self.table[index][i] = (key, value)
                  return
          self.table[index].append((key, value))
      
      def retrieve(self, key):
          index = self._hash(key)
          if self.table[index] is not None:
              for k, v in self.table[index]:
                  if k == key:
                      return v
          return None
      
      def delete(self, key):
          index = self._hash(key)
          if self.table[index] is not None:
              for i, (k, v) in enumerate(self.table[index]):
                  if k == key:
                      self.table[index].pop(i)
                      return