SHAバリアントの計算は簡単です。メッセージダイジェストを作成し、データで更新して結果を取得します。 しかし、コアが多い場合は、どのように並行して行うのですか?全体の結果が正しくないため、ブロックで計算して結果をハッシュすることはできません。 この計算を並行して行う方法は同じですか?SHAを並列計算するにはどうすればいいですか?
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ハッシュを並列に計算し、* n *ハッシュを最終的なものにXORする、 "n-SHA {1,256、etc.}"をあなた自身で定義することもできますハッシュ。しかし、それは "普通の" SHAではありません。 – TacticalCoder
@JB Nizet:大きなファイルを高速でハッシュしたいので、細かい並列処理が必要です。たとえば、コードの場合と同様に、1GBのゼロのハッシュが必要です。 –