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:     ;
  
  handle_custom_message({get_rt_reply, RT}, State) ->
      io:format("Got my succs RT~n", []),
      %% merge the routing tables
      LocalRT = rt_loop:get_rt(State),
      io:format("Got local RT~n"),
      NewRT = case LocalRT =:= RT of
          true ->
              io:format("Will try to merge ~p~n", [to_list(RT)]),
              %% TODO should all entries be converted to normal nodes here?
              lists:foldl(
                  fun(Entry, Acc) ->
                          entry_learn(Entry, Acc)
                  end
                  , LocalRT, to_list(RT))
              ;
          false ->
              io:format("RTs are already the same."),
              LocalRT
      end,
      io:format("Merged RTs"),
      rt_loop:set_rt(State, NewRT)
  
negative.code: 
  %% userdevguide-begin rt_frtchord:get_random_node_id
  %% @doc Generates a random node id, i.e. a random 128-bit number.
  get_random_node_id() ->
      case config:read(key_creator) of
          random -> hash_key_(randoms:getRandomString());
  