$str = "<?xml version='1.0' encoding='UTF-8'?>
<Data>
<method>good</method>
<action>add</action>
<params>
<member>
<good_sn>03000153</good_sn>
<good_name>50°老朋友</good_name>
<provider_id>null</provider_id>
<goods_number>48</goods_number>
<cat_id>03000</cat_id>
</member>
</params>
</Data>
";
算出来的结果为:e9b6357a1b5941404ef9e9123da49cf8我在Java里用Apache的org.apache.commons.codec.digest.DigestUtils类:
String str = "<?xml version='1.0' encoding='UTF-8'?>"+
"<Data>"+
"<method>good</method>"+
"<action>add</action>"+
"<params>"+
"<member>"+
"<good_sn>03000153</good_sn>"+
"<good_name>50°老朋友</good_name>"+
"<provider_id>null</provider_id>"+
"<goods_number>48</goods_number>"+
"<cat_id>03000</cat_id>"+
"</member>"+
"</params>"+
"</Data>";System.out.println("Apache MD5 :" + DigestUtils.md5Hex(str));
算出来的结果为:86b259cf9a5c4b5823f25673ca9cd1e3有没有两边统一的一个算法呢?!大家给个建议!

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2011-07-25 20:32:34 编辑
      

  2.   

    顶楼上!所以 XML 数据如果要做数字签名之类的操作,必须先规范化(canonical),请参考这个:
    http://www.ibm.com/developerworks/cn/xml/standards/x-c14nspec.html

    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  3.   

    PHP计算之前已经去掉换行符了("\n","\r"),计算的结果还是不一样的。SHA1和CRC32的结果是一致的!
      

  4.   

    这么奇怪,本地utf-8编码文件测试是一致的.
    $str = "<?xml version='1.0' encoding='UTF-8'?>
    <Data>
    <method>good</method>
    <action>add</action>
    <params>
    <member>
    <good_sn>03000153</good_sn>
    <good_name>50°老朋友</good_name>
    <provider_id>null</provider_id>
    <goods_number>48</goods_number>
    <cat_id>03000</cat_id>
    </member>
    </params>
    </Data>
    ";
    echo md5($str)."<br/>";//83d0768e1b64e41b5ce27a08a7492922
    echo md5(str_replace(PHP_EOL,"",$str));//86b259cf9a5c4b5823f25673ca9cd1e3
      

  5.   

    分别把字串保存到两个txt里面,然后用txt比较软件就能知道相差在哪了肉眼分辨的是字符串的内容,但电脑分辨的是字符串的内码
      

  6.   

    这个是亮点!你在 PHP 里是怎么计算 md5 以及 sha1、crc32 的?贴代码看看。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  7.   

    所有语言的md5结果都应该是相同的,结果不同只能是一个原因,就是的加密的两个字符串不同,1楼唠叨老大已经说的很清楚了,把java和php的字符串答应出来,对比一下,同时也确认一下编码格式是否一致!
    你可以做个简单的测试:md5('123456')看看PHP和java的加密结果是否相同!
      

  8.   

    PHP中:
    $str = "<?xml version='1.0' encoding='UTF-8'?>" .
    "<Data>" .
    "<method>good</method>" .
    "<action>add</action>" .
    "<params>" .
    "<member>" .
    "<good_sn>03000153</good_sn>" .
    "<good_name>50°老朋友</good_name>" .
    "<provider_id>null</provider_id>" .
    "<goods_number>48</goods_number>" .
    "<cat_id>03000</cat_id>" .
    "</member>" .
    "</params>" .
    "</Data>";
    如果是gbk的话还需要
    $str=iconv('gbk','utf-8',$str);
      

  9.   

    不可能的
    //这是gbk编码的串
    $str = "<?xml version='1.0' encoding='UTF-8'?>
    <Data>
    <method>good</method>
    <action>add</action>
    <params>
    <member>
    <good_sn>03000153</good_sn>
    <good_name>50°老朋友</good_name>
    <provider_id>null</provider_id>
    <goods_number>48</goods_number>
    <cat_id>03000</cat_id>
    </member>
    </params>
    </Data>
    ";echo 'gbk 含回车换行 '. md5($str) . PHP_EOL;
    $str = preg_replace("/[\r\n]/", '', $str);
    echo 'gbk '. md5($str) . PHP_EOL;
    echo 'utf-8 '. md5( iconv('gbk', 'utf-8', $str) );gbk 含回车换行 e9b6357a1b5941404ef9e9123da49cf8
    gbk 5702cd75efec7097e0e2ad937eecbbff
    utf-8 86b259cf9a5c4b5823f25673ca9cd1e3你自己对比一下
      

  10.   


    就用PHP内置的函数: php5(),sha1()。
      

  11.   

    最后还是Java请求一个PHP接口来解决这个问题了!