Erlang Hash Albero
-
13-09-2019 - |
Domanda
Sto lavorando su un'applicazione p2p che usa gli alberi di hash.
Le scrivo le funzioni di costruzione albero di hash (publ / 4 e publ_top / 4), ma non riesco a vedere come risolvere publ_top / 4.
cerco di costruire un albero con 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
Il codice in questione è qui:
http://github.com/AndreasBWagner/nivoa/blob/886c624c116c33cc821b15d371d1090d3658f961 /nivd.erl
Dove pensate che il problema è?
Grazie, Andreas
Soluzione
Guardando il codice posso vedere una questione che avrebbe generato quel particolare errore di eccezione
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.
Nella prima dichiarazione di funzione si corrispondono contro la lista vuota. Nella seconda dichiarazione è partita con un elenco di lunghezza (almeno) 2 ([F,S|T]
). Cosa succede quando FullLevelLen
è diverso da 1 e RestOfLevel
è una lista di lunghezza 1? . (Suggerimento: Si otterrà l'errore precedente)
L'errore sarebbe stato più facile da individuare se si farebbe corrispondenza modello sugli argomenti della funzione, forse qualcosa di simile a:
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) ->
% ...