编辑代码

-module(md5_utils).
-export([main/1,md5/1]).


%% @spec to_lower(Str) -> Str2
%% Str = string()
%% Str2 = string()
%% @doc 转换为小写字符
to_lower(Str) ->
    to_lower(Str, []).
to_lower([C|Cs], Acc) when C >= $A, C =< $Z ->
    to_lower(Cs, [C+($a-$A)| Acc]);
to_lower([C|Cs], Acc) ->
    to_lower(Cs, [C| Acc]);
to_lower([], Acc) ->
    lists:reverse(Acc).
    
%% @spec md5(Str) -> Bin
%% Str = string() | binary()
%% Bin = binary()
%% @doc md5编码
md5(Str) when is_list(Str) ->
    erlang:list_to_binary([
        case erlang:integer_to_list(N, 16) of
        Sub when length(Sub) == 2 -> to_lower(Sub);
        Sub when length(Sub) == 1 -> [$0|to_lower(Sub)];
        _ -> "00"
        end
        || N <- erlang:binary_to_list(crypto:hash(md5, Str))
    ]);
md5(Str) when is_binary(Str) ->
    md5(erlang:binary_to_list(Str)).

%% 测试函数
main(_) ->
    Val = md5("%40117%40120%40176%40161%40165%4080%40171%40150%40164%40171%40160%40162%40164%40116%4083%4099%40102%4096%4084%4082%40150%40158%40149%40160%40152%40156%40167%40160%40110%4084%40138%40133%40127%40102%40112%4086%4089%40163%40169%40146%40160%40156%40152%40159%40165%40165%40150%40111%4090%40158%40161%4084%40112%40110%40110%40162%40169%40156%40156%40164%40144%40159%40154%40164%40172%40154%40159%40153%40119%40108%40162%40150%40165%40171%40152%40154%40155%40117%40109%40167%40161%40148%40112%4099%40106%4099%40103%4099%40108%40104%40113%40113%40109%4097%40170%40154%40157%40119%40116%40160%40168%40151%40158%40159%40145%40166%40152%40160%40155%40117%40171%40162%40107%4097%40104%40106%40103%4099%40107%40105%40112%4098%40165%40168%40152%40155%40163%40144%40167%40154%40165%40153%40119%40108%40164%40166%40166%40151%40166%40165%40154%40156%40163%40145%40166%40159%40112%40110%4096%40159%40167%40165%40147%40162%40171%40157%40150%40164%40148%40159%40168%40119%40116%40163%40171%40148%40154%40163%40145%40166%40166%40113%40102%40104%4099%4098%40106%40100%4099%40100%4097%4099%40100%4099%40101%40102%40105%40110%40103%40107%40102%40106%40109%40113%40116%4099%40168%40162%40153%40150%40164%40151%40165%40162%40116%40115%40161%40147%40177%40143%40166%40155%40158%40149%40112%4099%40100%40101%40109%40102%4098%40100%4098%4097%40108%4089%40106%40102%40115%4097%40104%40107%4099%40106%40115%4098%40166%40152%40170%40145%40172%40153%40159%40151%40111%40108%40147%40158%40163%40168%40167%40173%40111%4099%4099%4097%40105%40117%40103%40149%40166%40159%40170%40159%40166%40118%40115%40166%40170%40152%40165%40167%40171%40110%4098%40110%4096%40163%40166%40146%40168%40168%40172%40119%40109%40151%40173%40165%40171%40154%40171%40147%40169%40145%40167%40146%40159%40171%40117%40101%40106%40107%4085%4086%40153%40156%40155%40171%40166%40158%4086%4085%40100%4087%4093%40170%40166%40155%40152%40156%40160%40154%40165%40153%4093%4084%40104%4097%4099%4092%4091%40100%40283%40188%40180%40281%40220%40236%40279%40190%40182%4084%4086%40109%4099%40152%40177%40173%40163%40147%40168%40144%40169%40154%40170%40149%40166%40163%40115%40109%4097%40165%40156%40166%40169%40152%40152%40151%40118%40108%4097%40163%40166%40153%40149%40156%40147%40160%40158%40172%40164%40147%40156%40150%40119%40105%40105%40104%40102%40113%40150%40104%40105%40103%40154%40154%40102%40102%40152%40146%40151%40158%40150%40150%40106%40104%4098%40150%40150%40108%40101%40111%40107%40150%40152%40151%4014724524136000672962283204644567170"),
    io:format("MD5 of 'abc': ~s~n", [Val]).