Erlang和JavaScript MD5摘要匹配

Muz*_*hua 5 javascript erlang yaws mnesia

在这里测试MD5的Javascript实现: http://www.webtoolkit.info/javascript-md5.html给出以下输出:

MD5("muzaaya") = "00e081abefbbbf72b2d5258196a9b6d0"

转到我的erlang shell,并计算相同值的MD5我得到这个:

Eshell V5.8.4  (abort with ^G)
1> erlang:md5("muzaaya").
<<0,224,129,171,239,187,191,114,178,213,37,129,150,169,
  182,208>>
2>

我怎么能比较这两个?如果来自JavaScript前端应用程序的MD5结果来到我的Erlang后端,我希望能够比较两个摘要.如何将Javascript MD5摘要与Erlang的摘要相匹配?

Ada*_*erg 16

MD5哈希本质上是128位数.

您在Erlang中收到的MD5值为16字节的二进制(16*8 = 128位).该二进制文件中的每个字节都必须转换为十六进制表示,以与JavaScript的MD5输出(每个字节有两个字符的十六进制字符串)相媲美:

2> lists:flatten([io_lib:format("~2.16.0b", [B]) || <<B>> <= MD5]).
"00e081abefbbbf72b2d5258196a9b6d0"
Run Code Online (Sandbox Code Playgroud)

首先,我们从二进制文件中获取每个字节,然后使用该io_lib模块将其格式化为十六进制字符串.然后我们使用flatten函数将其显示为可读字符串(尽管如果您要将值写入文件或套接字,这是不必要的,因为它们能够处理深度io列表,嵌套字符列表或二进制文件).

使用的格式字符串~2.16.0b表示b使用base 格式化integer(),使用padding字符16填充宽度(请参阅完整指南).20io:format/3

如果你想要一个二进制文件,你可以使用以下二进制理解:

3> << << (list_to_binary(io_lib:format("~2.16.0b", [C])))/binary >>
     || <<C>> <= MD5 >>.
<<"00e081abefbbbf72b2d5258196a9b6d0">>
Run Code Online (Sandbox Code Playgroud)

(而不是io_lib:format/2也有http_util:integer_to_hexlist/1,虽然我不知道它是否更快)