2012-01-05 3 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 {1,256, etc.}를 입력하여 * n * 부분에 입력을 분할하고 각 부분의 SHA 해시를 병렬로 계산 한 다음 * n * 해시를 최종 해시시. 그러나 그것은 "정상적인"SHA가 아닙니다. – TacticalCoder

+0

@JB Nizet : 대용량 파일을 빠르게 해시하고 싶기 때문에 세밀한 병렬 처리가 필요합니다. 예를 들어 코드에서와 같이 1GB의 해시가 필요합니다. –

답변

3

는 병렬로 작업을 수행 할 수 있어야 다중 스레드를 사용합니다.

AFAIK, 각 블록을 차례로 처리하는 메시지 다이제스트 만 계산할 수 있습니다. 따라서 하나의 스레드 만 사용하여 각 다이제스트 값을 계산할 수 있습니다. 그러나 여러 값을 생성하거나 병합 할 수 있다면 병행 할 수 있습니다.

+0

질문은 다중 스레드로 작업하는 방법, 여러 블록으로 작업하는 것입니다. SHA와의 병합이 가능합니까? –

+0

아니, 할 수 없다. – bmargulies

+0

각 SHA 다이제스트는 각 블록/스레드마다 하나씩 생성됩니다. 하나의 표준 SHA 다이제스트를 생성하기 위해 다중 스레드를 사용할 수 없습니다. –

관련 문제