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 rivejä
3.7 KiB

5 vuotta sitten
5 vuotta sitten
5 vuotta sitten
  1. -module(utTestMd5).
  2. -compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]).
  3. t1(N, Len) ->
  4. Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
  5. tt1(N, Bin, <<>>).
  6. %% 这种方式更快
  7. tt1(0, _Bin, Md5) ->
  8. Md5;
  9. tt1(N, Bin, _Md5) ->
  10. Md5 = erlang:md5(Bin),
  11. tt1(N - 1, Bin, Md5).
  12. t2(N, Len) ->
  13. Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
  14. tt2(N, Bin, <<>>).
  15. tt2(0, _Bin, Md5) ->
  16. Md5;
  17. tt2(N, Bin, _Md5) ->
  18. Md5 = crypto:hash(md5, Bin),
  19. tt2(N - 1, Bin, Md5).
  20. t3(N, Len) ->
  21. Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
  22. Md5Bin = erlang:md5(Bin),
  23. tt3(N, Md5Bin, <<>>).
  24. tt3(0, _Md5Bin, HexStr) ->
  25. HexStr;
  26. tt3(N, Md5Bin, _HexStr) ->
  27. <<Hash:128/integer>> = Md5Bin,
  28. HexStr =string:to_lower(integer_to_list(Hash, 16)),
  29. tt3(N - 1, Md5Bin, HexStr).
  30. t4(N, Len) ->
  31. Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
  32. Md5Bin = erlang:md5(Bin),
  33. tt4(N, Md5Bin, <<>>).
  34. tt4(0, _Md5Bin, HexStr) ->
  35. HexStr;
  36. tt4(N, Md5Bin, _HexStr) ->
  37. HexStr = lists:flatten([io_lib:format("~2.16.0b", [X]) || X <- binary_to_list(Md5Bin)]),
  38. tt4(N - 1, Md5Bin, HexStr).
  39. %% 这种方式更加快 快好几倍呢
  40. t5(N, Len) ->
  41. Bin = list_to_binary([X rem 256 || X <- lists:seq(1, Len)]),
  42. Md5Bin = erlang:md5(Bin),
  43. tt5(N, Md5Bin, <<>>).
  44. tt5(0, _Md5Bin, HexStr) ->
  45. HexStr;
  46. tt5(N, Md5Bin, _HexStr) ->
  47. HexStr = utHex:binaryToHex(Md5Bin),
  48. tt5(N - 1, Md5Bin, HexStr).
  49. deHex(H) when H >= $a, H =< $f -> H - $a + 10;
  50. deHex(H) when H >= $A, H =< $F -> H - $A + 10;
  51. deHex(H) when H >= $0, H =< $9 -> H - $0.
  52. t6(N) ->
  53. HexBin = "b59c67bf196a4758191e42f76670ceba",
  54. tt6(N, HexBin, []).
  55. tt6(0, _HexBin, List) ->
  56. List;
  57. tt6(N, HexBin, _List) ->
  58. HexBin1 = list_to_binary(HexBin),
  59. List = [(deHex(X1) * 16 + deHex(X2)) || <<X1:8, X2:8>> <= HexBin1],
  60. tt6(N - 1, HexBin, List).
  61. %% 这种方式更加快 快好几倍呢
  62. t7(N) ->
  63. Hex = "b59c67bf196a4758191e42f76670ceba",
  64. tt7(N, Hex).
  65. tt7(0, Hex) ->
  66. {String, _} =
  67. lists:foldr(
  68. fun(E, {Acc, nolow}) ->
  69. {Acc, deHex(E)};
  70. (E, {Acc, LO}) ->
  71. {[deHex(E) * 16 + LO | Acc], nolow}
  72. end,
  73. {[], nolow}, Hex),
  74. String;
  75. tt7(N, Hex) ->
  76. {String, _} =
  77. lists:foldr(
  78. fun(E, {Acc, nolow}) ->
  79. {Acc, deHex(E)};
  80. (E, {Acc, LO}) ->
  81. {[deHex(E) * 16 + LO | Acc], nolow}
  82. end,
  83. {[], nolow}, Hex),
  84. String,
  85. tt7(N - 1, Hex).
  86. u4(0, Fun) ->
  87. ?MODULE:Fun();
  88. u4(N, Fun) ->
  89. ?MODULE:Fun(),
  90. u4(N - 1, Fun).
  91. uuid() ->
  92. erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})).
  93. uuid2() ->
  94. term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()}).
  95. get_uuid() ->
  96. <<(crypto:strong_rand_bytes(8))/bytes,
  97. (erlang:term_to_binary(erlang:now()))/bytes>>.
  98. u1(0) ->
  99. crypto:strong_rand_bytes(16);
  100. u1(N) ->
  101. crypto:strong_rand_bytes(16),
  102. u1(N - 1).
  103. u2(0) ->
  104. erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()}));
  105. u2(N) ->
  106. erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})),
  107. u2(N - 1).
  108. u3(0) ->
  109. crypto:strong_rand_bytes(4);
  110. u3(N) ->
  111. crypto:strong_rand_bytes(4),
  112. u3(N - 1).
  113. u33(0) ->
  114. rand:uniform(2100000000);
  115. u33(N) ->
  116. rand:uniform(2100000000),
  117. u33(N - 1).
  118. u333(0) ->
  119. erlang:localtime();
  120. u333(N) ->
  121. erlang:localtime(),
  122. u333(N - 1).
  123. u4(0) ->
  124. erlang:md5(integer_to_list(erlang:phash2({os:system_time(micro_seconds), make_ref(), make_ref()})));
  125. u4(N) ->
  126. erlang:md5(integer_to_list(erlang:phash2({os:system_time(micro_seconds), make_ref(), make_ref()}))),
  127. u1(N - 1).