Hash Tables Explained: How Hash Functions Power O(1) Lookups