Many tasks in computer systems could be abstracted as distributing items into buckets, so that the allocation of items across buckets is as balanced as possible, and, furthermore, given an item's identifier it is possible to determine quickly to which bucket it was assigned. A canonical example is a dictionary data structure, where 'items' stands for key-value pairs and 'buckets' for memory locations. Another example is a distributed key-value store,...