2009-06-13 7 views
0

Je travaille sur une application p2p qui utilise des arbres de hachage.Erlang Hash Arbre

Je suis en train d'écrire les fonctions de construction d'arbre de hachage (publ/4 et publ_top/4), mais je ne vois pas comment résoudre publ_top/4.

J'essaie de construire un arbre avec 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 

Le code en question est ici:

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

Où pensez-vous que le problème est?

Merci, Andreas

+0

Si vous êtes curieux, l'application est décrite ici: http: //wiki.github .com/AndreasBWagner/nivoa – andreasw

Répondre

4

En regardant votre code, je peux voir un problème qui générerait que notamment une erreur d'exception

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. 

Dans la première déclaration de fonction match contre la liste vide. Dans la deuxième déclaration, vous correspondez à une liste de longueur (au moins) 2 ([F,S|T]). Que se passe-t-il lorsque FullLevelLen est différent de 1 et RestOfLevel est une liste de longueur 1? (Indice: vous obtiendrez l'erreur ci-dessus).

L'erreur serait plus facile à repérer si vous le feriez match de motif sur les arguments de la fonction, peut-être quelque chose comme:

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) -> 
%  ... 
+0

Merci! le programme construit un arbre de hachage et vos conseils de style ont amélioré mon codage. – andreasw