onto this circle. Since a 128-bit ID space is enormous, it is unlikely that an
object will hash to exactly the same ID as a machine’s IP address hashes
to. To account for this unlikelihood, each object is maintained on the node
whose ID is closest, in this 128-bit space, to the object ID. In other words,
the idea is to use a high-quality hash function to map both nodes and
objects into the same large, sparse ID space; you then map objects to
nodes by numerical proximity of their respective identifiers. Like ordinary
hashing, this distributes objects fairly evenly across nodes, but, unlike
ordinary hashing, only a small number of objects have to move when a
node (hash bucket) joins or leaves.
We now turn to the second question—how does a user that wants to
access object x know which node is closest in x’s ID in this space? One
possible answer is that each node keeps a complete table of node IDs and
their associated IP addresses, but this would not be practical for a large
network. The alternative, which is the approach used by structured peerto-
peer networks, is to route a message to this node! In other words, if we
construct the overlay in a clever way—which is the same as saying that
we need to choose entries for a node’s routing table in a clever way—then
we find a node simply by routing toward it. Collectively, this approach is sometimes called a distributed hash table (DHT), since conceptually, the
hash table is distributed over all the nodes in the network.