【发布时间】: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