Erlang Md5
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).