The array you cannot afford
Imagine you want to look up a user by email in one step. An array gives you that already: users[i] is a single memory access, no search. The catch is that arrays are indexed by small integers, and your key is a string.
A hash table is the trick that bridges the two. A hash function turns any key into an integer, and you reduce that integer into a valid slot index:
slot = hash(key) % len(table)
Now table[slot] is one access again. The entire subject of hash tables is what happens when two different keys land on the same slot, because with a finite table that is not a rare accident. It is guaranteed.

