Erlang中计算16位的MD5字符串

 

erlangbif中自带了md5计算函数,但是结果却是二进制的,即使转成list,也是10进制表示,google了一下得到一段代码用于获得字符串形式的md5结果(16位):

md5(S) ->        

Md5_bin =  erlang:md5(S), 

Md5_list = binary_to_list(Md5_bin), 

lists:flatten(list_to_hex(Md5_list)). 

 

list_to_hex(L) -> 

lists:map(fun(X) -> int_to_hex(XendL). 

 

int_to_hex(Nwhen N < 256 -> 

[hex(N div 16), hex(N rem 16)]. 

hex(Nwhen N < 10 -> 

       $0+N

hex(Nwhen N >= 10N < 16 ->      

$a + (N-10).

英文链接  http://sacharya.com/md5-in-erlang/

Erlang中粘包处理

 

开始时用的传统思路(循环读取):

recv(ClientSockPacketLenOldRemain

  when is_integer(PacketLenOldand is_binary(Remain) ->

case gen_tcp:recv(ClientSock0of

{ok, B} ->

Bin = <<Remain/binary, B/binary>>,

%% read the packet length

if PacketLenOld =:= 0 andalso erlang:byte_size(Bin) > 2

 -> <<PacketLen:16Remain2/binary>> = Bin;

   true -> Remain2 = BinPacketLen = PacketLenOld

end,

?DEBUG("packet length ~p", [PacketLen]),

if 

erlang:byte_size(Remain2) >= PacketLen

  -> {RealDataNext} = split_binary(Remain2PacketLen),

 MainData = decode(RealData),

 {ok, MainData0Next};

true -> {continue, PacketLenRemain2}

end;

{error, closed} ->

?DEBUG("socket closed ~p ~n", [ClientSock]),

{error, closed};

{error, Reason} ->

?ERROR_MSG("socket closed ~p with reason: ~p ~n", [ClientSockReason]),

{error, Reason}

end.

翻了翻文档发现实际上在erlang中没有必要这样麻烦

The Length argument is only meaningful when the socket is in 

raw mode and denotes the number of bytes to read. 

If Length = 0, all available bytes are returned. 

If Length > 0, exactly Length bytes are returned, or an error;

recv(ClientSock) ->

case gen_tcp:recv(ClientSock2of

{ok, PacketLenBin} -> <<PacketLen:16>> = PacketLenBin,

case gen_tcp:recv(ClientSockPacketLenof

{ok, RealData} ->

?DEBUG("recv data ~p", [RealData]),

{ok, decode(RealData)};

{error, Reason} ->

?ERROR_MSG("read packet data failed with reason: ~p", [Reason]),

{error, Reason}

end;

{error, Reason} -> 

?ERROR_MSG("read packet length failed with reason: ~p", [Reason]),

{error, Reason}

end.

OTP中supervisor启动过程

 

rabbit_sup模块开始看起:

rabbit_sup模块的start_link是被rabbit app模块的start/2方法所调用的

rabbit.erl文件:

start(normal, []) ->

{ok, SupPid} = rabbit_sup:start_link(),

rabbit_sup.erl文件:

-define(SERVER?MODULE).

start_link() ->

supervisor:start_link({local, ?SERVER}, ?MODULE, []).

这里的?SERVER和?MODULE是一样的值,都为rabbit_sup 。 (全文…)