Как рассчитать sha256 быстрее в Java? - PullRequest
6 голосов
/ 21 октября 2011

Я обнаружил, что вычисление sha256 в Java идет медленно.Например, это медленнее, чем python.Я написал два простых теста, которые вычисляют sha256 из 1 ГБ нулей.В обоих случаях результат один и тот же и правильный, но время питона составляет 5653 мс, а время java - 8623 мс (на 53% медленнее).Результат каждый раз одинаков, и это важное различие для меня.

Как ускорить вычисления в java?

Тесты:

Java:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class BenchmarkSha256 {

  public static void main(String... args) throws NoSuchAlgorithmException {
    int size = 1024 * 1024;
    byte[] bytes = new byte[size];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    long startTime = System.nanoTime();
    for (int i = 0; i < 1024; i++)
      md.update(bytes, 0, size);
    long endTime = System.nanoTime();
    System.out.println(String.format("%1$064x", new java.math.BigInteger(1, md.digest())));
    System.out.println(String.format("%d ms", (endTime - startTime) / 1000000));
  }

}

Python:

#!/usr/bin/env python

import hashlib
import time

size = 1024 * 1024
bytes = bytearray(size)
md = hashlib.sha256()
startTime = time.time()
for i in range(0, 1024):
  md.update(bytes)
endTime = time.time()
print "%s\n%d ms" % (md.hexdigest(), (endTime - startTime) * 1000)

результаты:

~> java BenchmarkSha256
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
8623 ms

~> python BenchmarkSha256.py 
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
5653 ms

версии Java и Python:

~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

~> python --version
Python 2.7

Ответы [ 4 ]

4 голосов
/ 21 октября 2011

Вы пробовали вводить данные постепенно? Вы можете использовать messageDigest.update() с байтами, а затем получить окончательный дайджест с messageDigest.digest()?

Выделение массива 1 ГБ в памяти - довольно сложная операция. Вы можете обнаружить, что меньшие инкрементные обновления быстрее в конце.

3 голосов
/ 21 октября 2011

Ну, если вы не сделаете это для сравнения двух программ командной строки, это не лучший тест. Прежде всего, эти цифры загрязняются огромными различиями в накладных расходах, связанных с каждой программой. Время запуска ВМ будет отличаться. Скорость выделения памяти будет варьироваться.

Чтобы немного это исправить, просто возьмите две выборки времени до и после каждого фактического вычисления MD5 в самом коде.

Это будет фактически измерять производительность самой операции хеширования.

0 голосов
/ 21 октября 2011

Хотя вам, возможно, удастся немного повысить производительность инструмента Java, реализация Python обычно будет быстрее, поскольку он, вероятно, делегирует собранные библиотеки, которые работают со значительно лучшей производительностью.

Если ваш проект не имеет каких-либо существенных зависимостей от Java, я бы рекомендовал перейти к реализации Python.

0 голосов
/ 21 октября 2011

Я думаю, что Java просто медленная по своей природе. Этот вопрос может иметь к вам отношение Java: Эффективно рассчитать хэш большого файла SHA-256

...