2012-01-05 9 views
1

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

} 
+0

複数のスレッドを使用して消化する価値があるように、十分に長い文字列をダイジェストしていますか?ハッシュする複数の文字列を持っている場合は、文字列をスレッドに分散させるだけで解決策が得られます。あなたのプログラムはハッシュ以外に何をしていますか? –

+3

SHAバリアントはすべて連鎖ハッシュ関数です。彼らはブロックで動作し、最初のハッシュに加えて、後続のハッシュごとに前のブロックからのハッシュに依存します。したがって、通常のSHAハッシュを並列化することはできません。もちろん、* n *部分の入力を分割し、各部分のSHAハッシュを並列に計算し、* n *ハッシュを最終的なものにXORする、 "n-SHA {1,256、etc.}"をあなた自身で定義することもできますハッシュ。しかし、それは "普通の" SHAではありません。 – TacticalCoder

+0

@JB Nizet:大きなファイルを高速でハッシュしたいので、細かい並列処理が必要です。たとえば、コードの場合と同様に、1GBのゼロのハッシュが必要です。 –

答えて

3

あなたが並列でタスクを実行できるようにする必要があり、複数のスレッドを使用するには:

次は、シーケンシャルJavaの例です。

AFAIKでは、各ブロックを順番に処理するメッセージダイジェストしか計算できません。そのため、各ダイジェスト値を計算するのに1つのスレッドしか使用できません。しかし、複数の値を生成したりマージしたりすることができれば、それは並行して行うことができます。

+0

質問は、複数のスレッドでそれを行う方法、複数のブロックで作業することですか? SHAとのマージは可能ですか? –

+0

できません。 – bmargulies

+0

ブロック/スレッドごとに1つずつ、複数のSHAダイジェストを取得します。 1つの標準SHAダイジェストを作成するために複数のスレッドを使用することはできません。 –

関連する問題