erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

77 rader
1.9 KiB

-module(nifHashb).
-on_load(init/0).
-export([
new/0
, get/2
, put/3
, hash1/2
, hash2/2
, hash3/2
, cb1/2
, cb2/2
, compareBin1/2
, compareBin2/2
]).
init() ->
SoName =
case code:priv_dir(?MODULE) of
{error, _} ->
case code:which(?MODULE) of
Filename when is_list(Filename) ->
filename:join([filename:dirname(Filename), "../priv", "nifHashb"]);
_ ->
filename:join("../priv", "nifHashb")
end;
Dir ->
filename:join(Dir, "nifHashb")
end,
erlang:load_nif(SoName, 0).
new() ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
get(Ref, Key) ->
KeyBin = erlang:term_to_binary(Key),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
get(Ref, Hash1, Hash2, KeyBin).
get(Ref, Hash1, Hash2, KeyBin) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
put(Ref, Key, Value) ->
KeyBin = erlang:term_to_binary(Key),
ValueBin = erlang:term_to_binary(Value),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
put(Ref, Hash1, Hash2, KeyBin, ValueBin).
put(Ref, Hash1, Hash2, Key, Value) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
hash1(Term, Range) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
hash2(Term, Range) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
hash3(Term, Range) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
cb1(Term1, Term2) ->
compareBin1(term_to_binary(Term1), term_to_binary(Term2)).
cb2(Term1, Term2) ->
compareBin2(term_to_binary(Term1), term_to_binary(Term2)).
compareBin1(Bin1, Bin2) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
compareBin2(Bin1, Bin2) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).