Hash tables provide constant time insertion, deletion and search by using a hash function to map keys to indexes in an array. Collisions occur when different keys hash to the same index. Separate chaining resolves collisions by storing keys in linked lists at each index. Open addressing resolves collisions by probing to the next index using functions like linear probing. The load factor and choice of hash function impact performance.