20 #include <openssl/md5.h>
21 #endif // HAVE_OPENSSL
24 using std::istringstream;
26 using std::ostringstream;
36 encode_hex(_hv[0], buffer);
37 encode_hex(_hv[1], buffer + 8);
38 encode_hex(_hv[2], buffer + 16);
39 encode_hex(_hv[3], buffer + 24);
40 out.write(buffer, 32);
53 while (ch != EOF && !in.fail() && isxdigit(ch)) {
62 in.clear(std::ios::failbit|in.rdstate());
72 decode_hex(buffer, _hv[0]);
73 decode_hex(buffer + 8, _hv[1]);
74 decode_hex(buffer + 16, _hv[2]);
75 decode_hex(buffer + 24, _hv[3]);
120 istringstream strm(text);
131 encode_hex(_hv[0], buffer);
132 encode_hex(_hv[1], buffer + 8);
133 encode_hex(_hv[2], buffer + 16);
134 encode_hex(_hv[3], buffer + 24);
135 return string(buffer, 32);
144 istringstream strm(text);
165 nassertr(text.size() == 16,
false);
179 hash_file(
const Filename &filename) {
180 Filename bin_filename = Filename::binary_filename(filename);
183 if (istr ==
nullptr) {
188 bool result = hash_stream(*istr);
193 #endif // HAVE_OPENSSL
202 hash_stream(istream &stream) {
203 unsigned char md[16];
208 static const int buffer_size = 1024;
209 char buffer[buffer_size];
212 stream.seekg(0, std::ios::beg);
214 stream.read(buffer, buffer_size);
215 size_t count = stream.gcount();
217 MD5_Update(&ctx, buffer, count);
218 stream.read(buffer, buffer_size);
219 count = stream.gcount();
230 _hv[0] = (md[0] << 24) | (md[1] << 16) | (md[2] << 8) | (md[3]);
231 _hv[1] = (md[4] << 24) | (md[5] << 16) | (md[6] << 8) | (md[7]);
232 _hv[2] = (md[8] << 24) | (md[9] << 16) | (md[10] << 8) | (md[11]);
233 _hv[3] = (md[12] << 24) | (md[13] << 16) | (md[14] << 8) | (md[15]);
237 #endif // HAVE_OPENSSL
247 hash_buffer(
const char *buffer,
int length) {
248 unsigned char md[16];
249 MD5((
const unsigned char *)buffer, length, md);
253 _hv[0] = (md[0] << 24) | (md[1] << 16) | (md[2] << 8) | (md[3]);
254 _hv[1] = (md[4] << 24) | (md[5] << 16) | (md[6] << 8) | (md[7]);
255 _hv[2] = (md[8] << 24) | (md[9] << 16) | (md[10] << 8) | (md[11]);
256 _hv[3] = (md[12] << 24) | (md[13] << 16) | (md[14] << 8) | (md[15]);
259 #endif // HAVE_OPENSSL
267 encode_hex(uint32_t val,
char *buffer) {
268 buffer[0] = tohex(val >> 28);
269 buffer[1] = tohex(val >> 24);
270 buffer[2] = tohex(val >> 20);
271 buffer[3] = tohex(val >> 16);
272 buffer[4] = tohex(val >> 12);
273 buffer[5] = tohex(val >> 8);
274 buffer[6] = tohex(val >> 4);
275 buffer[7] = tohex(val);
282 decode_hex(
const char *buffer, uint32_t &val) {
283 unsigned int bytes[8];
284 for (
int i = 0; i < 8; i++) {
285 bytes[i] = fromhex(buffer[i]);
288 val = ((bytes[0] << 28) |