我在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代需要花费这么多时间,项目将被取消。 所以我谦卑地寻求帮助。那些想要帮助的人,非常尊重他们。那些想要攻击的人,请寻找其他问题
答案 0 :(得分:1)
我做了一些测试,这里有一些解释:
你有大量的样板来生成md5。在我的电脑上打印200毫秒之前打印md5,但你可能没有测试它。
当我替换
此
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;
}
}