On modern hardware a key lookup in a hash table isn't necessarily a single page read! Sure, it's a single virtual memory access, but if that page isn't in your TLB you need to read the page table... and if the page containing that part of the page table isn't in the TLB you need to read that page...
On modern hardware, every memory access looks very much like a B-tree lookup.
On modern hardware, every memory access looks very much like a B-tree lookup.