Как рассчитать SHA параллельно? - PullRequest
1 голос
/ 05 января 2012

Расчет вариантов SHA прост: вы создаете дайджест сообщения, обновляете его данными и получаете результат. Но, если у нас много ядер, как это сделать параллельно? Вы не можете рассчитать его по блокам и хэшировать результаты, потому что общий результат не будет правильным. Как сделать этот расчет параллельно, получив тот же результат?

Ниже приведен последовательный пример 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));
  }

}

1 Ответ

3 голосов
/ 05 января 2012

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

AFAIK, вы можете рассчитать только дайджест сообщения, обрабатывающий каждый блок по очереди.Таким образом, вы можете использовать только один поток для расчета каждого значения дайджеста.Однако, если вы можете создать несколько значений или объединить их, вы можете сделать это параллельно.

...