-1

ハッシュ ツリーを使用する p2p アプリに取り組んでいます。

ハッシュ ツリー構築関数 (publ/4 および publ_top/4) を作成していますが、publ_top/4 を修正する方法がわかりません。

publ/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

問題はどこにあると思いますか?

ありがとう、アンドレアス

4

1 に答える 1

4

コードを見ると、その特定の例外エラーを生成する問題が 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(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 番目の宣言では、長さ (少なくとも) 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) ->
%     ...
于 2009-06-14T05:21:04.190 に答える