69 return (x & y) | (~x & z);
73 return (x & z) | (y & ~z);
86 return (x << n) | (x >> (32 - n));
121 const size_t txtlen = text.length();
122 const size_t max_txtlen = std::numeric_limits<size_type>::max();
123 update(text.c_str(),
static_cast<size_type>(std::min(txtlen, max_txtlen)));
137 state[0] = 0x67452301;
138 state[1] = 0xefcdab89;
139 state[2] = 0x98badcfe;
140 state[3] = 0x10325476;
148 for (
unsigned int i = 0, j = 0; j < len;
i++, j += 4)
149 output[
i] = ((
uint4)input[j]) | (((
uint4)input[j + 1]) << 8) |
150 (((
uint4)input[j + 2]) << 16) | (((
uint4)input[j + 3]) << 24);
159 for (
size_type i = 0, j = 0; j < len;
i++, j += 4) {
160 output[j] = input[
i] & 0xff;
161 output[j + 1] = (input[
i] >> 8) & 0xff;
162 output[j + 2] = (input[
i] >> 16) & 0xff;
163 output[j + 3] = (input[
i] >> 24) & 0xff;
176 FF(a, b, c,
d, x[0],
S11, 0xd76aa478);
177 FF(
d, a, b, c, x[1],
S12, 0xe8c7b756);
178 FF(c,
d, a, b, x[2],
S13, 0x242070db);
179 FF(b, c,
d, a, x[3],
S14, 0xc1bdceee);
180 FF(a, b, c,
d, x[4],
S11, 0xf57c0faf);
181 FF(
d, a, b, c, x[5],
S12, 0x4787c62a);
182 FF(c,
d, a, b, x[6],
S13, 0xa8304613);
183 FF(b, c,
d, a, x[7],
S14, 0xfd469501);
184 FF(a, b, c,
d, x[8],
S11, 0x698098d8);
185 FF(
d, a, b, c, x[9],
S12, 0x8b44f7af);
186 FF(c,
d, a, b, x[10],
S13, 0xffff5bb1);
187 FF(b, c,
d, a, x[11],
S14, 0x895cd7be);
188 FF(a, b, c,
d, x[12],
S11, 0x6b901122);
189 FF(
d, a, b, c, x[13],
S12, 0xfd987193);
190 FF(c,
d, a, b, x[14],
S13, 0xa679438e);
191 FF(b, c,
d, a, x[15],
S14, 0x49b40821);
194 GG(a, b, c,
d, x[1],
S21, 0xf61e2562);
195 GG(
d, a, b, c, x[6],
S22, 0xc040b340);
196 GG(c,
d, a, b, x[11],
S23, 0x265e5a51);
197 GG(b, c,
d, a, x[0],
S24, 0xe9b6c7aa);
198 GG(a, b, c,
d, x[5],
S21, 0xd62f105d);
199 GG(
d, a, b, c, x[10],
S22, 0x2441453);
200 GG(c,
d, a, b, x[15],
S23, 0xd8a1e681);
201 GG(b, c,
d, a, x[4],
S24, 0xe7d3fbc8);
202 GG(a, b, c,
d, x[9],
S21, 0x21e1cde6);
203 GG(
d, a, b, c, x[14],
S22, 0xc33707d6);
204 GG(c,
d, a, b, x[3],
S23, 0xf4d50d87);
205 GG(b, c,
d, a, x[8],
S24, 0x455a14ed);
206 GG(a, b, c,
d, x[13],
S21, 0xa9e3e905);
207 GG(
d, a, b, c, x[2],
S22, 0xfcefa3f8);
208 GG(c,
d, a, b, x[7],
S23, 0x676f02d9);
209 GG(b, c,
d, a, x[12],
S24, 0x8d2a4c8a);
212 HH(a, b, c,
d, x[5],
S31, 0xfffa3942);
213 HH(
d, a, b, c, x[8],
S32, 0x8771f681);
214 HH(c,
d, a, b, x[11],
S33, 0x6d9d6122);
215 HH(b, c,
d, a, x[14],
S34, 0xfde5380c);
216 HH(a, b, c,
d, x[1],
S31, 0xa4beea44);
217 HH(
d, a, b, c, x[4],
S32, 0x4bdecfa9);
218 HH(c,
d, a, b, x[7],
S33, 0xf6bb4b60);
219 HH(b, c,
d, a, x[10],
S34, 0xbebfbc70);
220 HH(a, b, c,
d, x[13],
S31, 0x289b7ec6);
221 HH(
d, a, b, c, x[0],
S32, 0xeaa127fa);
222 HH(c,
d, a, b, x[3],
S33, 0xd4ef3085);
223 HH(b, c,
d, a, x[6],
S34, 0x4881d05);
224 HH(a, b, c,
d, x[9],
S31, 0xd9d4d039);
225 HH(
d, a, b, c, x[12],
S32, 0xe6db99e5);
226 HH(c,
d, a, b, x[15],
S33, 0x1fa27cf8);
227 HH(b, c,
d, a, x[2],
S34, 0xc4ac5665);
230 II(a, b, c,
d, x[0],
S41, 0xf4292244);
231 II(
d, a, b, c, x[7],
S42, 0x432aff97);
232 II(c,
d, a, b, x[14],
S43, 0xab9423a7);
233 II(b, c,
d, a, x[5],
S44, 0xfc93a039);
234 II(a, b, c,
d, x[12],
S41, 0x655b59c3);
235 II(
d, a, b, c, x[3],
S42, 0x8f0ccc92);
236 II(c,
d, a, b, x[10],
S43, 0xffeff47d);
237 II(b, c,
d, a, x[1],
S44, 0x85845dd1);
238 II(a, b, c,
d, x[8],
S41, 0x6fa87e4f);
239 II(
d, a, b, c, x[15],
S42, 0xfe2ce6e0);
240 II(c,
d, a, b, x[6],
S43, 0xa3014314);
241 II(b, c,
d, a, x[13],
S44, 0x4e0811a1);
242 II(a, b, c,
d, x[4],
S41, 0xf7537e82);
243 II(
d, a, b, c, x[11],
S42, 0xbd3af235);
244 II(c,
d, a, b, x[2],
S43, 0x2ad7d2bb);
245 II(b, c,
d, a, x[9],
S44, 0xeb86d391);
253 std::memset(x, 0,
sizeof x);
260 void MD5::update(
const unsigned char input[], size_type length)
266 if ((
count[0] += (length << 3)) < (length << 3))
276 if (length >= firstpart)
279 std::memcpy(&
buffer[index], input, firstpart);
292 memcpy(&
buffer[index], &input[
i], length -
i);
298 void MD5::update(
const char input[], size_type length)
300 update((
const unsigned char*)input, length);
309 static unsigned char padding[64] = {
310 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
317 unsigned char bits[8];
322 size_type padLen = (index < 56) ? (56 - index) : (120 - index);
350 for (
int i = 0;
i<16;
i++)
351 sprintf(buf +
i * 2,
"%02x",
digest[
i]);
364 return out <<
md5.hexdigest();
369 std::string
md5(
const std::string& str)
373 return md5.hexdigest();