Я понимаю, что вы хотите, чтобы ваши пароли проверялись как можно быстрее, но ваш проект находится на стадии, когда вам нужно оптимизировать это?
У меня есть модуль аутентификации в одном из моих проектов, и у меня те же цели, что и у вас. Поскольку у меня еще не было возможности оптимизировать, я использую транзакции и списки 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>
Надеюсь, я помог.