Separate chaining stores colliding keys in a bucket list (or tree). Open addressing keeps all entries in the table and probes alternative slots (e.g., linear/quadratic probing, double hashing). Chaining is simpler for deletes; open addressing can be more cache-friendly but is sensitive to load factor.