【问题标题】:How to calculate SHA in parallel?如何并行计算SHA?
【发布时间】:2012-01-05 13:41:21
【问题描述】:

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));
  }

}

【问题讨论】:

  • 您是否有足够长的字符串来消化以使其值得使用多个线程来消化它?因为如果你有多个字符串要散列,那么只需将你的字符串分布在线程上,你就会有你的解决方案。除了散列,你的程序还做什么?
  • SHA 变体都是链式哈希函数。它们在块上工作,除了初始散列之外,每个后续散列都取决于前一个块的散列。所以你不能并行化一个“正常”的 SHA 哈希。您当然可以定义自己的“n-SHA{1,256,etc.}”,它将输入分成 n 个部分,并行计算每个部分的 SHA 哈希,然后对 n 散列到您的最终散列中。但这不是“正常”的 SHA。
  • @JB Nizet :我想快速散列大文件,所以我需要细粒度的并行性。例如,在代码中,我们需要 1GB 的零散列,速度很快。
  • @user988052 : 你的意思是在多核机器上没有办法更快地得到这个结果吗?
  • @Hristo Hristov:确实如此。据我所知,没有办法并行化链式哈希函数。

标签: java multithreading parallel-processing hash sha


【解决方案1】:

要使用多个线程,您需要能够并行执行任务。

AFAIK,你只能计算一个消息摘要依次处理每个块。因此,您只能使用一个线程来计算每个摘要值。但是,如果您可以生成多个值或将它们合并,则可以并行进行。

【讨论】:

  • 问题是,如何用多个线程,在多个块上工作?是否可以与 SHA 合并?
  • 您将获得多个 SHA 摘要,每个块/线程一个。您不能使用多个线程来创建一个标准 SHA 摘要。
  • 所以,问题的答案是:“这不可能!” ?
  • 不改变结果。
猜你喜欢
  • 2011-10-21
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多