anchor.diff:      empty(Neighbors).
   
   %% @doc Hashes the key to the identifier space.
  --spec hash_key(client_key()) -> key().
   hash_key(Key) -> hash_key_(Key).
   
   %% @doc Hashes the key to the identifier space (internal function to allow
   %%      use in e.g. get_random_node_id without dialyzer complaining about the
   %%      opaque key type).
  --spec hash_key_(client_key()) -> key_t().
   hash_key_(Key) ->
       <<N:128>> = erlang:md5(client_key_to_binary(Key)),
       N.
  
positive.code: %% userdevguide-begin rt_frtchord:handle_custom_message
  %% @doc Handle custom messages. The following messages can occur:
  %%      - TODO explain messages
  -spec handle_custom_message
      (custom_message() | any(), rt_loop:state_active()) -> unknown_event.
  
  % send the RT to a node asking for it
  handle_custom_message({get_rt, Pid}, State) ->
  
negative.code: %%      Also updates the failure detector if ReportToFD is set.
  %%      Note: the external routing table only changes if the internal RT has
  %%      changed.
  check(OldRT, OldRT, _, _, _) -> ok;
  check(OldRT, NewRT, _OldNeighbors, NewNeighbors, ReportToFD) ->
      Pid = pid_groups:get_my(dht_node),
  