2013-10-07 3 views
-1

Я получил md5 строки в java и php. Кажется, что генерация md5 java занимает много времени, чем генерация md5 php.Почему генерация java md5 медленнее, чем php

Мой тест, 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.00

Так md5 поколение РНР занимает всего около 10-12 мс, а в Java занимает около 18-20 !! Является ли мой тест неправильным? Если это не , то есть ли другой способ получить md5 намного быстрее, чем это?

Редактировать: Для всех людей, жалующихся на x, медленнее, чем у. Я задал этот вопрос, потому что у нас есть приложение, и в java будет изменен основной кусок. Мы должны обслуживать каждый запрос в течение 30 мс. Теперь, если только генерация md5 займет много времени, проект будет отменен. Поэтому я смиренно прошу о помощи. Те, кто хочет помочь, очень уважают их. Те, кто хочет атаковать, пожалуйста, посмотрите на другие вопросы

+5

ли это в 1000 раз, или 10000 или 100000. Может быть, Java имеет высокое время запуска, потому что необходимо загрузить дополнительные библиотеки (под капотом). Или, может быть, это просто, что sysout медленный, удалите его из времени. – Halcyon

+0

-1 для вопроса «почему X быстрее, чем Y». – Kayaman

+1

Вы сравниваете две совершенно разные технологии с совершенно разными бэкендами и стеками программного обеспечения ... также делайте это более одного раза, чтобы получить более значимые результаты. – akluth

ответ

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; 
    } 
} 
+0

спасибо за помощь. Я попробую это и дам вам знать – Shades88

+0

NP. Если вам нужно использовать MD5 как строку, вам все равно нужно найти лучший способ преобразования в строку, чем HexBinaryAdapter – Piro

Смежные вопросы