Erlang Hash Tree - PullRequest
       21

Erlang Hash Tree

0 голосов
/ 14 июня 2009

Я работаю над приложением p2p, которое использует хеш-деревья.

Я пишу функции построения дерева хешей (publ / 4 и publ_top / 4), но не могу понять, как исправить pub_top / 4.

Я пытаюсь построить дерево с публикацией / 1:

nivd:publ("file.txt").

prints hashes...

** exception error: no match of right hand side value [67324168]
     in function  nivd:publ_top/4
     in call from nivd:publ/1

Код здесь:

http://github.com/AndreasBWagner/nivoa/blob/886c624c116c33cc821b15d371d1090d3658f961/nivd.erl

Как вы думаете, в чем проблема?

Спасибо, Andreas

1 Ответ

4 голосов
/ 14 июня 2009

Глядя на ваш код, я вижу одну проблему, которая может привести к этой конкретной ошибке исключения

publ_top(_,[],Accumulated,Level) ->
    %% Go through the accumulated list of hashes from the prior level
    publ_top(string:len(Accumulated),Accumulated,[],Level+1);

publ_top(FullLevelLen,RestofLevel,Accumulated,Level) ->
  case FullLevelLen =:= 1 of
    false -> [F,S|T]=RestofLevel,
      io:format("~w---~w~n",[F,S]),
      publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);
    true -> done
  end.

В первом объявлении функции вы сопоставляете пустой список. Во втором объявлении вы сопоставляете список длины (как минимум) 2 ([F,S|T]). Что происходит, когда FullLevelLen отличается от 1, а RestOfLevel - это список длины 1? (Подсказка: вы получите вышеуказанную ошибку).

Ошибка будет легче обнаружить, если вы сопоставите шаблон с аргументами функции, возможно, что-то вроде:

publ_top(_,[],Accumulated,Level) ->
    %% Go through the accumulated list of hashes from the prior level
    publ_top(string:len(Accumulated),Accumulated,[],Level+1);

publ_top(1, _, _, _) ->
    done;

publ_top(_, [F,S|T], Accumulated, Level) ->
    io:format("~w---~w~n",[F,S]),
    publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);

%% Missing case:
% publ_top(_, [H], Accumulated, Level) ->
%     ...
...