Hashing is a technique used to map data of arbitrary size to data of a fixed size. A hash table stores key-value pairs with the key being generated from a hash function. A good hash function uniformly distributes keys while minimizing collisions. Common hash functions include division, multiplication, and universal hashing. Collision resolution strategies like separate chaining and open addressing handle collisions by storing data in linked lists or probing for empty buckets. Hashing provides efficient average-case performance of O(1) for operations like insertion, search and deletion.