SHA1の解析(逆計算)

30分プログラム、その716。とある事情SHA1の解析(逆計算)をしなければならなくなりました。就活をしてるわけではないんですけど、まあ流れというやつです。
で、全組合せに対してSHA1を計算して、それが目的のものと一致するかどうかを調べるというブルートフォースアタックをしかけています。カンで対象をアルファベット小文字だけに制限してます。
あと、SHA1の計算は、- http://journal.batard.info/post/2007/07/19/erlang-sha-1-libraryにあったライブラリを使わさせてもらいました。

使い方

% 答えがfooの場合
1> netagent:start().
*** 1 ***
*** 2 ***
*** 3 ***
answer = "foo"

ソースコード

-module(netagent).
-compile([export_all]).

makePassword(Pid,0,S) ->
    Pid ! {password, S};
makePassword(Pid,N,S) ->
    lists:foreach(fun(C) ->
			  makePassword(Pid,N-1,[C|S])
		  end,
		  lists:seq($a,$z)).

makePassword(Pid,N) ->
    makePassword(Pid,N,""),
    Pid ! done.

checkPassword(Pid) ->
    Ans = "E5877EBE3560BE14D35C6EB96FFA38FEE97078F0",
    receive
	{password, S} ->
	    case sha1:hexstring(S) == Ans of
		true -> Pid ! {ok,S};
		_ -> checkPassword(Pid)
	    end;
	done ->
	    Pid ! done
    end.

main(N) ->
    io:format("*** ~p ***~n",[N]),
    Self = self(),
    Check = spawn(fun () -> checkPassword(Self) end),
    spawn(fun () -> makePassword(Check,N) end),
    receive
	{ok,S} ->
	    io:format("answer = ~p~n",[S]),
	    ok;
	done ->
	    main(N+1)
    end.

start() ->
    main(1).