This document discusses hashing and hash tables. It begins by introducing hash tables and describing how hashing works by mapping keys to array indices using a hash function to allow for fast insertion, deletion and search operations in O(1) average time. However, hash tables do not support ordering of elements efficiently. The document then discusses issues with hash functions such as collisions when different keys map to the same index. It describes techniques for collision resolution including separate chaining, where each index points to a linked list, and open addressing techniques like linear probing, quadratic probing and double hashing that resolve collisions by probing alternate indices in the array.