-1

我在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

测试.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 会花费这么多时间,项目将被废弃。因此,我谦卑地寻求帮助。愿意帮助的人,非常尊重他们。想攻击的,请寻找其他问题

4

1 回答 1

1

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

  1. 你有很多关于生成 md5 的样板文件。在我的电脑上打印 md5 需要 200 毫秒,但您可能正在测试没有它。

  2. 当我更换

这个

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

return Arrays.toString(s);

我从 18 毫秒到 6 毫秒,所以字符串转换花费了很多时间,可能是因为 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;
  }
}
于 2013-10-07T11:44:14.217 回答