【问题标题】:Erlang and JavaScript MD5 Digest matchErlang 和 JavaScript MD5 摘要匹配
【发布时间】:2011-10-12 16:34:59
【问题描述】:

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

MD5("muzaaya") = "00e081abefbbbf72b2d5258196a9b6d0"

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

Eshell V5.8.4(使用 ^G 中止) 1> 二郎:md5(“muzaaya”)。 > 2>

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

【问题讨论】:

标签: javascript erlang mnesia yaws


【解决方案1】:

如果您需要单线,可以是这样的:

1> B = erlang:md5("muzaaya").
<<0,224,129,171,239,187,191,114,178,213,37,129,150,169,
  182,208>>
2> lists:flatten([io_lib:format("~2.16.0b", [C]) || <<C>> <= B]).
"00e081abefbbbf72b2d5258196a9b6d0"

【讨论】:

    【解决方案2】:

    如果你想在 JavaScript 端做,你可以使用这个

    function md5HexToArray ( hexStr ) {  
      var i, arr = [], arraylength = hexStr.length/2;
    
      for( i = 0; i < arraylength ; i++ ) {
         arr[i] = parseInt( hexStr.substr(i*2,2), 16) ;
      }
    
      return arr;
    };
    

    但是@Wrikken 的评论看起来应该也可以正常工作。

    【讨论】:

      【解决方案3】:

      MD5 哈希本质上是一个 128 位的数字。

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

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

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

      使用的格式字符串~2.16.0b 表示使用基数16 格式化整数(b),并使用填充字符0 填充到宽度2(有关完整指南,请参阅io:format/3)。

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

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

      (除了io_lib:format/2还有http_util:integer_to_hexlist/1,虽然不知道是不是更快)

      【讨论】:

        【解决方案4】:

        这是位串理解版本,可能是最快和最节省内存的:

        hstr(B) when is_binary(B) ->
            T = {$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$a,$b,$c,$d,$e,$f},
            << <<(element(X bsr 4 + 1, T)), (element(X band 16#0F + 1, T))>>
            || <<X:8>> <= B >>.
        

        3> M:hstr(erlang:md5("muzaaya")).

        4> >

        【讨论】:

          【解决方案5】:

          另一个更快的版本:

          hstr(B) when is_binary(B) ->
            << <<(hex(A)), (hex(B))>> || <<A:4,B:4>> <= B >>.
          
          -compile({inline, [hex/1]}).
          
          hex(0)  -> $0;
          hex(1)  -> $1;
          hex(2)  -> $2;
          hex(3)  -> $3;
          hex(4)  -> $4;
          hex(5)  -> $5;
          hex(6)  -> $6;
          hex(7)  -> $7;
          hex(8)  -> $8;
          hex(9)  -> $9;
          hex(10) -> $a;
          hex(11) -> $b;
          hex(12) -> $c;
          hex(13) -> $d;
          hex(14) -> $e;
          hex(15) -> $f.
          

          但最快的版本将是

          md5_hex(L) ->
            << A1:4, A2:4,  A3:4,  A4:4,  A5:4,  A6:4,  A7:4,  A8:4,
              A9:4,  A10:4, A11:4, A12:4, A13:4, A14:4, A15:4, A16:4,
              A17:4, A18:4, A19:4, A20:4, A21:4, A22:4, A23:4, A24:4,
              A25:4, A26:4, A27:4, A28:4, A29:4, A30:4, A31:4, A32:4
              >> = erlang:md5(L),
            << (hex(A1)), (hex(A2)),  (hex(A3)),  (hex(A4)),
              (hex(A5)),  (hex(A6)),  (hex(A7)),  (hex(A8)),
              (hex(A9)),  (hex(A10)), (hex(A11)), (hex(A12)),
              (hex(A13)), (hex(A14)), (hex(A15)), (hex(A16)),
              (hex(A17)), (hex(A18)), (hex(A19)), (hex(A20)),
              (hex(A21)), (hex(A22)), (hex(A23)), (hex(A24)),
              (hex(A25)), (hex(A26)), (hex(A27)), (hex(A28)),
              (hex(A29)), (hex(A30)), (hex(A31)), (hex(A32)) >>.
          

          但您不应该进行此优化。

          编辑:这个版本的hex/1 更快:

          hex(X) ->
            element(X+1, {$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $a, $b, $c, $d, $e, $f}).
          

          EDIT2:另一种方法:

          md5_hex(L) ->
              <<X:128>> = erlang:md5(L),
              B = integer_to_binary(X,16),
              list_to_binary([lists:duplicate(32-byte_size(B),$0)|B]).
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-15
            • 1970-01-01
            • 1970-01-01
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多