Насколько я понимаю, вы хотите, чтобы ваши пароли проверялись как можно быстрее, но находится ли ваш проект на этапе, когда вам необходимо оптимизировать это?
У меня есть модуль аутентификации в одном из моих проектов, и у меня такие же цели, как и у вас. Поскольку у меня еще не было возможности оптимизировать, я использую транзакции mnsesia и списки для имен пользователей и паролей.
Вот часть моего модуля авторизации.
-module(auth).
-export([init/1, add_user/2, start_session/2]).
-record(auth_user, {username, password}).
init(Nodes) ->
mnesia:create_table(auth_user,
[{disc_copies, Nodes},
{attributes, record_info(fields, auth_user)}]).
add_user(Username, Password) ->
T = fun() ->
mnesia:write(#auth_user {
username = Username,
password = Password})
end,
mnesia:transaction(T).
start_session(Username, Password) ->
T = fun() ->
mnesia:read(auth_user, Username)
end,
{atomic, Ret} = mnesia:transaction(T),
case Ret of
[U] ->
if (U#auth_user.password == Password) ->
true;
true ->
false
end;
_Else ->
false
end.
После компиляции и запуска оболочки erlang.
Eshell V5.8.3 (abort with ^G)
1> mnesia:create_schema([node()]).
ok
3> mnesia:start().
ok
4> auth:init([node()]).
{atomic,ok}
5> auth:add_user("rodericktaylor", "password").
{atomic,ok}
6> true = auth:start_session("rodericktaylor", "password").
true
7>
Чтобы увидеть, возникает ли у меня та же проблема, что и у вас, я переключился на двоичные значения и сделал грязное чтение.
start_session_dirty(Username, Password) ->
case mnesia:dirty_read(auth_user, Username) of
[U] ->
if (U#auth_user.password == Password) ->
true;
true ->
false
end;
_Else ->
false
end.
Следующие команды в оболочке erl показывают, что он работает так, как вы ожидаете.
12> auth:add_user(<<"rodericktaylor">>, <<"binarypassword">>).
{atomic,ok}
14> true = auth:start_session_dirty(<<"rodericktaylor">>, <<"binarypassword">>).
true
15>
Надеюсь, я помог.
person
Roderick Taylor
schedule
27.04.2011