Erlang Md5

五 10th, 2009

io:format(lists:flatten(array:to_list(array:new([{size,16},{default,"~.16b"}])), “~n”), binary_to_list(erlang:md5(“hello”))).

之前一直以为上面这段MD5没问题,突然有个地方用到,调试了1天发现居然是这个~.16b有问题,当md5的二进制值小于16时少了一位。比如 7 ~.16b的结果是7其实MD5字符串表示应该用两个字符串表示一个16进制值,所以应该是07。
换了一段仔细看了个详细。

-module(md5).
-export([md5_hex/1]).

md5_hex(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(X) end, L).

int_to_hex(N) when N < 256 ->
       [hex(N div 16), hex(N rem 16)].

hex(N) when N < 10 ->
       $0+N;
hex(N) when N >= 10, N < 16 ->
       $a + (N-10).
标签:
目前还没有任何评论.