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 {1,256, etc.}를 입력하여 * n * 부분에 입력을 분할하고 각 부분의 SHA 해시를 병렬로 계산 한 다음 * n * 해시를 최종 해시시. 그러나 그것은 "정상적인"SHA가 아닙니다. – TacticalCoder
@JB Nizet : 대용량 파일을 빠르게 해시하고 싶기 때문에 세밀한 병렬 처리가 필요합니다. 예를 들어 코드에서와 같이 1GB의 해시가 필요합니다. –