Hashing is a technique for mapping data to array indices to allow for fast insertion and search operations in O(1) time on average. It works by applying a hash function to a key to obtain an array index, which may cause collisions that require resolution techniques like separate chaining or open addressing. Open addressing resolves collisions by probing alternative indices using functions like linear probing, quadratic probing, or double hashing to find the next available empty slot.