erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

154 lines
3.7 KiB

-module(utTestMd5).
-compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]).
t1(N, Len) ->
Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
tt1(N, Bin, <<>>).
%% 这种方式更快
tt1(0, _Bin, Md5) ->
Md5;
tt1(N, Bin, _Md5) ->
Md5 = erlang:md5(Bin),
tt1(N - 1, Bin, Md5).
t2(N, Len) ->
Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
tt2(N, Bin, <<>>).
tt2(0, _Bin, Md5) ->
Md5;
tt2(N, Bin, _Md5) ->
Md5 = crypto:hash(md5, Bin),
tt2(N - 1, Bin, Md5).
t3(N, Len) ->
Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
Md5Bin = erlang:md5(Bin),
tt3(N, Md5Bin, <<>>).
tt3(0, _Md5Bin, HexStr) ->
HexStr;
tt3(N, Md5Bin, _HexStr) ->
<<Hash:128/integer>> = Md5Bin,
HexStr =string:to_lower(integer_to_list(Hash, 16)),
tt3(N - 1, Md5Bin, HexStr).
t4(N, Len) ->
Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
Md5Bin = erlang:md5(Bin),
tt4(N, Md5Bin, <<>>).
tt4(0, _Md5Bin, HexStr) ->
HexStr;
tt4(N, Md5Bin, _HexStr) ->
HexStr = lists:flatten([io_lib:format("~2.16.0b", [X]) || X <- binary_to_list(Md5Bin)]),
tt4(N - 1, Md5Bin, HexStr).
%% 这种方式更加快 快好几倍呢
t5(N, Len) ->
Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
Md5Bin = erlang:md5(Bin),
tt5(N, Md5Bin, <<>>).
tt5(0, _Md5Bin, HexStr) ->
HexStr;
tt5(N, Md5Bin, _HexStr) ->
HexStr = utHex:binaryToHex(Md5Bin),
tt5(N - 1, Md5Bin, HexStr).
deHex(H) when H >= $a, H =< $f -> H - $a + 10;
deHex(H) when H >= $A, H =< $F -> H - $A + 10;
deHex(H) when H >= $0, H =< $9 -> H - $0.
t6(N) ->
HexBin = "b59c67bf196a4758191e42f76670ceba",
tt6(N, HexBin, []).
tt6(0, _HexBin, List) ->
List;
tt6(N, HexBin, _List) ->
HexBin1 = list_to_binary(HexBin),
List = [(deHex(X1) * 16 + deHex(X2)) || <<X1:8, X2:8>> <= HexBin1],
tt6(N - 1, HexBin, List).
%% 这种方式更加快 快好几倍呢
t7(N) ->
Hex = "b59c67bf196a4758191e42f76670ceba",
tt7(N, Hex).
tt7(0, Hex) ->
{String, _} =
lists:foldr(
fun(E, {Acc, nolow}) ->
{Acc, deHex(E)};
(E, {Acc, LO}) ->
{[deHex(E) * 16 + LO | Acc], nolow}
end,
{[], nolow}, Hex),
String;
tt7(N, Hex) ->
{String, _} =
lists:foldr(
fun(E, {Acc, nolow}) ->
{Acc, deHex(E)};
(E, {Acc, LO}) ->
{[deHex(E) * 16 + LO | Acc], nolow}
end,
{[], nolow}, Hex),
String,
tt7(N - 1, Hex).
u4(0, Fun) ->
?MODULE:Fun();
u4(N, Fun) ->
?MODULE:Fun(),
u4(N - 1, Fun).
uuid() ->
erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})).
uuid2() ->
term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()}).
get_uuid() ->
<<(crypto:strong_rand_bytes(8))/bytes,
(erlang:term_to_binary(erlang:now()))/bytes>>.
u1(0) ->
crypto:strong_rand_bytes(16);
u1(N) ->
crypto:strong_rand_bytes(16),
u1(N - 1).
u2(0) ->
erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()}));
u2(N) ->
erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})),
u2(N - 1).
u3(0) ->
crypto:strong_rand_bytes(4);
u3(N) ->
crypto:strong_rand_bytes(4),
u3(N - 1).
u33(0) ->
rand:uniform(2100000000);
u33(N) ->
rand:uniform(2100000000),
u33(N - 1).
u333(0) ->
erlang:localtime();
u333(N) ->
erlang:localtime(),
u333(N - 1).
u4(0) ->
erlang:md5(integer_to_list(erlang:phash2({os:system_time(micro_seconds), make_ref(), make_ref()})));
u4(N) ->
erlang:md5(integer_to_list(erlang:phash2({os:system_time(micro_seconds), make_ref(), make_ref()}))),
u1(N - 1).