【发布时间】: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的代码吗?