【问题标题】:why is java md5 generation is slower than php为什么java md5生成比php慢
【发布时间】:2013-10-07 10:07:57
【问题描述】:

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

【问题讨论】:

  • 执行 1000 次,或 10000 或 100000 次。也许 Java 的启动时间很长,因为它需要加载额外的库(在后台)。或者可能只是 sysout 很慢,把它从计时中去掉。
  • 您正在比较两种完全不同的技术,它们具有完全不同的后端和软件堆栈……也可以多次这样做以获得更有意义的结果。
  • 你还没有证明它更慢
  • 我对Java一点也不熟悉,但是Java程序员不用注意,连时间计算都是错误的。一纳秒是十亿分之一秒,你只除以 1000 两次,就像你用微秒做的那样。它是 ~0.0002 与 ~0.00012,两者之间并没有太大区别。
  • Utils.md5 过程中可能有错误?能贴出获取MD5的代码吗?

标签: java php md5


【解决方案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;
  }
}

【讨论】:

  • 感谢您的帮助。我会试试这个,让你知道
  • NP。如果您需要使用 MD5 作为字符串,您仍然需要找到比 HexBinaryAdapter 更好的转换为字符串的方法
猜你喜欢
  • 2014-08-19
  • 2016-06-14
  • 2012-02-19
  • 2012-03-08
  • 2012-02-13
  • 1970-01-01
  • 2012-07-22
  • 2023-01-30
  • 2020-05-14
相关资源
最近更新 更多