[erlang-questions] Password generator in Erlang

Zabrane Mickael <>
Tue Aug 14 18:12:14 CEST 2012


Thank Serker.

Moving andom:seed(A1, A2, A3) at start fix it.

1> passwd:test().
Generate 10000 random password and check for collisions ...
Number of collisions: 0


--------------------
test() ->
    {A1,A2,A3} = now(),
    random:seed(A1, A2, A3),
    N = 10000,
    io:format("Generate ~p random password and check for collisions ...~n", [N]),
    test(N, dict:new(), 0).
test(0, _, C) ->
    io:format("Number of collisions: ~p~n", [C]);
test(N, Dict, C) ->
    Password = passwd(),
    case dict:find(Password, Dict) of
        {ok, _} -> %% collision detected
            test(N - 1, Dict, C + 1);  
        error ->
            test(N - 1, dict:append(Password, 1, Dict), C)
    end.

passwd() ->
    passwd(8).
passwd(Length) ->

    lists:flatten(lists:foldl(fun(_,AccIn) ->
                                      [random:uniform(90) + 32 | AccIn] end,
                              [], lists:seq(1,Length))).

--------------------

Regards,
Zabrane

On Aug 14, 2012, at 5:43 PM, Sverker Eriksson wrote:

> Try only call random:seed(A1, A2, A3) once at start.
> 
> For cryptographic safe random generation look at crypto module.
> 
> /Sverker
> 
> 
> Zabrane Mickael wrote:
>> Hi guys,
>> 
>> This one fires a lot of collisions (http://schemecookbook.org/Erlang/NumberRandomNumber):
>> 
>> ------------------
>> test() ->
>>    crypto:start(),
>>    N = 10000,
>>    io:format("Generate ~p random passwords and check for collisions ...~n", [N]),
>>    test(N, dict:new(), 0).
>> test(0, _, C) ->
>>    io:format("Number of collisions: ~p~n", [C]);
>> test(N, Dict, C) ->
>>    Password = passwd(),
>>    case dict:find(Password, Dict) of
>>        {ok, _} -> %% collision detected
>>            test(N - 1, Dict, C + 1);          error ->
>>            test(N - 1, dict:append(Password, 1, Dict), C)
>>    end.
>> 
>> passwd() ->
>>    passwd(8).
>> passwd(Length) ->
>>    {A1,A2,A3} = now(),
>>    random:seed(A1, A2, A3),
>>    lists:flatten(lists:foldl(fun(_,AccIn) ->
>>                                      [random:uniform(90) + 32 | AccIn] end,
>>                              [], lists:seq(1,Length))).
>> 
>> ----------------
>> 
>> > passwd:test().
>> Generate 10000 random password and check for collisions ...
>> Number of collisions: 1182
>> 
>> Anything better guys? Something with less collisions if possible.
>> 
>> Regards,
>> Zabrane
>> 
>>  
> 






More information about the erlang-questions mailing list