25 FuncName =
" TestCalcMD5 ";
36 disp([
" ==== Test CalcMD5, ", datestr(now, 0)]);
38 TestData = [,
" d41d8cd98f00b204e9800998ecf8427e "; ...
39 " a ",
" 0cc175b9c0f1b6a831c399e269772661 "; ...
40 " abc ",
" 900150983cd24fb0d6963f7d28e17f72 "; ...
41 " message digest ",
" f96b697d7cb7938d525a2f31aaf161d0 "; ...
42 " abcdefghijklmnopqrstuvwxyz ",
" c3fcd3d76192e4007dfb496cca67e13b "; ...
43 " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ", ...
44 " d174ab98d277d9f5a5611c2c9f419d9f "; ...
45 [
" 123456789012345678901234567890123456789012345678901234567890123456 ", ...
46 " 78901234567890 "],
" 57edf4a22be3c955ac49da2e2107b67a "; ...
47 char(0:255),
" e2c865db4162bed963bfaa9ef6ac18f0 "];
50 fprintf(
" Known answer test from RFC 1321 for strings and files: ");
54 for iTest = 1:size(TestData, 1)
56 Str =
CalcMD5(TestData[iTest, 1],
" char ");
57 if strcmpi(Str, TestData[iTest, 2]) == 0
59 error([
" *** ", FuncName,
" : Failed for string: ", ...
60 char(10),
" [ ", TestData[iTest, 1],
" ] "]);
64 FID = fopen(TestFile,
" wb+ ");
67 error([
" *** ", FuncName,
" : Cannot open test file [ ", TestFile,
" ] "]);
69 fwrite(FID, TestData[iTest, 1],
" uchar ");
72 Str2 =
CalcMD5(TestFile,
" file ");
73 if strcmpi(Str2, TestData[iTest, 2]) == 0
75 error([
" *** ", FuncName,
" : Failed for file: ", ...
76 char(10),
" [ ", TestData[iTest, 1],
" ] "]);
84 fprintf(
" %d random tests with hex, HEX, dec and base64 output: ", N);
86 data = uint8(fix(rand(1, 1 + fix(rand * 100)) * 256));
87 lowHexOut =
CalcMD5(data,
" char ",
" hex ");
88 upHexOut =
CalcMD5(data,
" char ",
" HEX ");
89 decOut =
CalcMD5(data,
" char ",
" Dec ");
90 b64Out =
CalcMD5(data,
" char ",
" Base64 ");
92 if not(strcmpi(lowHexOut, upHexOut) && ...
93 isequal(sscanf(lowHexOut,
" %2x "), decOut(:)) && ...
94 isequal(Base64decode(b64Out), decOut))
96 error([
" *** ", FuncName,
" : Different results for output types. "]);
100 if rem(length(data), 2) == 0
101 doubleData =
double(data);
102 uniData =
char(doubleData(1:2:end) + 256 * doubleData(2:2:end));
103 uniOut =
CalcMD5(uniData,
" unicode ",
" dec ");
104 if not(isequal(uniOut, decOut))
106 error([
" *** ", FuncName,
" : Different results for unicode input. "]);
111 fprintf(
" Unicode input: ok\n\n ");
115 disp(
" == Test speed: ");
116 disp(
" (Short data: mainly the overhead of calling the function) ");
119 for Len = [10, 100, 1000, 10000, 1e5, 1e6, 1e7]
120 [Number, Unit] = UnitPrint(Len);
121 fprintf(
" Data length: %s %s:\n ", Number, Unit);
122 data = uint8(fix(rand(1, Len) * 256));
126 finTime = iniTime + Delay;
128 while cputime < finTime
129 x = java.security.MessageDigest.getInstance(
" MD5 ");
132 javaLoop = javaLoop + 1;
134 javaLoopPerSec = javaLoop / (cputime - iniTime);
135 [Number, Unit] = UnitPrint(javaLoopPerSec * Len);
136 fprintf(
" java: %6s %s/sec\n ", Number, Unit);
140 finTime = iniTime + Delay;
142 while cputime < finTime
143 mexHash =
CalcMD5(data,
" char ",
" dec ");
144 mexLoop = mexLoop + 1;
146 mexLoopPerSec = mexLoop / (cputime - iniTime);
147 [Number, Unit] = UnitPrint(mexLoopPerSec * Len);
148 fprintf(
" mex: %6s %s/sec: %.1f times faster\n ", ...
149 Number, Unit, mexLoopPerSec / javaLoopPerSec);
152 if ~isequal(javaHash(:), mexHash(:))
153 error([
" *** ", FuncName,
" : Different results from java and Mex. "]);
158 fprintf(
" \nCalcMD5 seems to work well.\n ");
191 Pool = [65:90, 97:122, 48:57, 43, 47];
193 v8 = [128, 64, 32, 16, 8, 4, 2, 1];
194 v6 = [32; 16; 8; 4; 2; 1];
197 In = reshape(In, 1, []);
198 Table = zeros(1, 256);
200 Value = Table(In) - 1;
202 X = rem(floor(Value(ones(6, 1), :) ./ v6(:, ones(length(In), 1))), 2);
203 Out = v8 * reshape(
X(1:fix(numel(
X) / 8) * 8), 8, []);
213 Number = sprintf(
" %d ", round(N));
216 Number = sprintf(
" %.1f ", N / 1000);
219 Number = sprintf(
" %.1f ", N / 1e6);
function varargout = typecast(varargin)
function MD5 = CalcMD5(Data, InClass, OutClass)
128 bit MD5 checksum: file, string, byte stream [MEX] This function calculates a 128 bit checksum for...
function TestCalcMD5(doSpeed)
Automatic test: CalcMD5 (Mex) This is a routine for automatic testing. It is not needed for processin...
function [ Number , Unit ] = TestCalcMD5>UnitPrint(N)
A MatLab character array.
function Out = TestCalcMD5>Base64decode(In)