为什么java md5生成比php慢

时间:2013-10-07 10:07:57

标签: java php md5

我在java和php中获得了字符串的md5。似乎java的md5代比php的md5代花了很长时间。

我的测试,test.java

start = System.nanoTime();
String md5 = Utils.md5("sample test string");
System.out.println(md5);
System.out.println((System.nanoTime()-start)/1000/1000);

Utils.md5的代码:

public static String md5(String stringToDigest) throws NoSuchAlgorithmException {
    if(stringToDigest == null) {
            return "";
    }
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] s = md.digest(stringToDigest.getBytes());
    HexBinaryAdapter hba = new HexBinaryAdapter();
    String md5 = hba.marshal(s);
    return md5;
}

告诉我:

CCEA62E4F30D422B123B9FDFB02CD496
20

test.php的

<?php
$start = microtime(true);
echo md5('sample test string');
echo "\n".microtime(true)-$start."\n";

告诉我:

ccea62e4f30d422b123b9fdfb02cd496
0.00012302398681641

因此,php的md5只需要大约10-12毫秒,而java的大约需要18-20! 我的考试错了吗?如果它不是那么还有另一种方法可以比这更快地获得md5吗?

编辑: 所有抱怨x的人都比y慢。我问过这个问题,因为我们有一个应用程序在运行,一个主要的块将在java中重新设计。我们必须在30毫秒内满足每一项要求。现在,如果只有md5代需要花费这么多时间,项目将被取消。 所以我谦卑地寻求帮助。那些想要帮助的人,非常尊重他们。那些想要攻击的人,请寻找其他问题

1 个答案:

答案 0 :(得分:1)

我做了一些测试,这里有一些解释:

  1. 你有大量的样板来生成md5。在我的电脑上打印200毫秒之前打印md5,但你可能没有测试它。

  2. 当我替换

  3. HexBinaryAdapter hba = new HexBinaryAdapter();
    String md5 = hba.marshal(s);
    return md5;
    

    return Arrays.toString(s);
    

    我从18ms到6ms,所以很多时间用于字符串转换,可能是因为HexBinaryAdapter与xml相关(我知道Arrays.toString不会将其转换为正确的字符串)。

    3. 最重要当我从测量区域中取出MessageDigest md = MessageDigest.getInstance("MD5");(使其静止)时,我得到224us(微秒)。这是java搜索合适的提供程序以生成md5的部分。 所以实际上你并没有测量MD5的产生!

    这是我的代码运行得更快:

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    
    public class Test7{
        static MessageDigest md; 
        static {
            try {
                md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws NoSuchAlgorithmException {
        long start = System.nanoTime();
        String md5 = md5("sample test string");
        long time = (System.nanoTime()-start)/1000;
        System.out.println(time);
        System.out.println(md5);
      }
      public static String md5(String stringToDigest) throws NoSuchAlgorithmException {
          if(stringToDigest == null) {
                  return "";
          }
    
          byte[] s = md.digest(stringToDigest.getBytes());
          //HexBinaryAdapter hba = new HexBinaryAdapter();
          return Arrays.toString(s);
          //String md5 = hba.marshal(s);
          //return md5;
      }
    }