MATLAB에서 내 자신의 SHA1 구현을 작성했으며 올바른 해시를 제공합니다. 그러나 매우 느립니다 (문자열은 1000 a
의 코어 i7-2760QM에서 9.9 초 걸립니다). 느린 것은 MATLAB이 비트 논리 연산 (bitand
, bitor
, bitxor
, bitcmp
)을 구현하는 방법과 비트 단위로 논리 연산을 구현 한 결과라고 생각합니다. 교대 (bitshift
, bitrol
, bitror
)의 정수입니다. 어쨌든 인텔 x86 어셈블리에 모든 크기의 레지스터와 메모리 주소를 rol
및 ror
모두가 있기 때문에 MATLAB 비트 연산을 최적화하는 방법
fi
명령을 사용하여
bitrol
및
bitror
을위한 고정 소수점 숫자 객체를 구성 할 필요가 궁금합니다. 그러나
bitshift
은 매우 빠릅니다 (어떤 고정 소수점 숫자 비용 구조도 필요하지 않습니다. 보통
uint64
변수가 잘 작동합니다). 낯선 이유는 다음과 같습니다.
bitrol
및
bitror
은
fi
으로 구성된 고정 소수점 숫자 개체가 필요한 반면
bitshift
은 어셈블리 레벨에서 모두
shl
,
shr
,
rol
및
ror
으로 떨어집니다.
그래서이 함수를 C/C++에서 .mex 파일로 작성하기 전에이 함수의 성능을 향상시킬 방법이 있는지 알고 싶습니다. SHA1에 대한 몇 가지 구체적인 최적화가 있다는 것을 알고 있지만 비트 로테이션의 기본적인 구현이 너무 느리면 문제가되지 않습니다.
tic
및 toc
에 조금 테스트, 그것을 만드는 것이 느린 bitrol
와 fi
와의 루프가 있음을 알 수있다. 이 개 같은 루프가 있습니다
tic
및
toc
,
abc
내 노트북에 약 0.23 초 주변의 첫번째 느린 루프 전달되는 약 0.63 초, 소요 메시지의 SHA1 해시의 전체 계산과 측정
%# Define some variables.
FFFFFFFF = uint64(hex2dec('FFFFFFFF'));
%# constants: K(1), K(2), K(3), K(4).
K(1) = uint64(hex2dec('5A827999'));
K(2) = uint64(hex2dec('6ED9EBA1'));
K(3) = uint64(hex2dec('8F1BBCDC'));
K(4) = uint64(hex2dec('CA62C1D6'));
W = uint64(zeros(1, 80));
... some other code here ...
%# First slow loop begins here.
for index = 17:80
W(index) = uint64(bitrol(fi(bitxor(bitxor(bitxor(W(index-3), W(index-8)), W(index-14)), W(index-16)), 0, 32, 0), 1));
end
%# First slow loop ends here.
H = sha1_handle_block_struct.H;
A = H(1);
B = H(2);
C = H(3);
D = H(4);
E = H(5);
%# Second slow loop begins here.
for index = 1:80
rotatedA = uint64(bitrol(fi(A, 0, 32, 0), 5));
if (index <= 20)
% alternative #1.
xorPart = bitxor(D, (bitand(B, (bitxor(C, D)))));
xorPart = bitand(xorPart, FFFFFFFF);
temp = rotatedA + xorPart + E + W(index) + K(1);
elseif ((index >= 21) && (index <= 40))
% FIPS.
xorPart = bitxor(bitxor(B, C), D);
xorPart = bitand(xorPart, FFFFFFFF);
temp = rotatedA + xorPart + E + W(index) + K(2);
elseif ((index >= 41) && (index <= 60))
% alternative #2.
xorPart = bitor(bitand(B, C), bitand(D, bitxor(B, C)));
xorPart = bitand(xorPart, FFFFFFFF);
temp = rotatedA + xorPart + E + W(index) + K(3);
elseif ((index >= 61) && (index <= 80))
% FIPS.
xorPart = bitxor(bitxor(B, C), D);
xorPart = bitand(xorPart, FFFFFFFF);
temp = rotatedA + xorPart + E + W(index) + K(4);
else
error('error in the code of sha1_handle_block.m!');
end
temp = bitand(temp, FFFFFFFF);
E = D;
D = C;
C = uint64(bitrol(fi(B, 0, 32, 0), 30));
B = A;
A = temp;
end
%# Second slow loop ends here.
두 번째 슬로우 루프에서 0.38 초. 그렇다면 .mex 파일을 작성하기 전에 MATLAB에서 이러한 루프를 최적화 할 수있는 방법이 있습니까? bitshift하지 않는 반면
SHA1의 속도를 높이는 옵션은'java.security.MessageDigest' 라이브러리를 사용하거나 MEX 함수를 쓰는 것입니다. MATLAB 코드가 GNU Octave와 호환되도록 (그리고 개발 환경으로 GNU Octave를 사용하기를 바라고), MATLAB과 Octave 사이에서 Java를 처리하는 데있어 Java 라이브러리를 사용하는 것과는 약간의 차이점이있는 것처럼 보입니다. 비 이상적인 솔루션입니다. 그러나'DataHash'는 정말 빠르며 MEX 솔루션을 구현하거나 Java를 사용하지 않고 SHA1을 효율적으로 구현할 수있는 대안을 찾기 전에 작업을 수행 할 것입니다. – nrz
내 자신의 fMRI 분석 도구 상자를 Octave에 이식하는 것은 장기간의 프로젝트이며 필자는이를 바탕으로 대답을 제한하고 싶지 않았습니다. 어쨌든, 현재 내가 필요로하는 것은 개발을 계속할 수있는 대용량 파일 (MATLAB)에 대해 SHA1을 계산하는 효율적인 방법이며, 'DataHash'는이를위한 효과적인 해결책입니다. – nrz
@nrz : 옥타브에는 C 확장을 작성하기위한 호환 가능한 MEX API가 있습니다. 또한 OCT 파일 작성을위한 자체 API (MATLAB의 MEX 파일과 동일)가 있습니다. – Amro