Specifically: given a hash (or an array index), how does the machine get to the data in constant time?
It seems to me that even passing by all the other memory locations (or whatever) would take an amount of time equal to the number of locations passed (so linear time). A coworker has tried valiantly to explain this to me but had to give up when we got down to circuits.
Example:
my_array = new array(:size => 20)
my_array[20] = "foo"
my_array[20] # "foo"
Access of “foo” in position 20 is constant because we know which bucket “foo” is in. How did we magically get to that bucket without passing all the others on the way? To get to house #20 on a block you would still have to pass by the other 19…
“We” don’t “go” to the bucket at all. The way RAM physically works is more like broadcasting the bucket’s number on a channel on which all buckets listen, and the one whose number was called will send you its contents.
Calculations happen in the CPU. In theory, the CPU is the same “distance” from all memory locations (in practice it’s not, because of caching, which can have a huge impact on performance).
If you want the gritty details, read “What every programmer should know about memory”.