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 (!in.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) |
A StreamWriter object is used to write sequential binary data directly to an ostream.
A hierarchy of directories and files that appears to be one continuous file system, even though the files may originate from several different sources that may not be related to the actual OS's file system.
void output_dec(std::ostream &out) const
Outputs the HashVal as four unsigned decimal integers.
std::istream * open_read_file(const Filename &filename, bool auto_unwrap) const
Convenience function; returns a newly allocated istream if the file exists and can be read...
Stores a 128-bit value that represents the hashed contents (typically MD5) of a file or buffer...
bool set_from_dec(const std::string &text)
Sets the HashVal from a string with four decimal numbers.
bool set_from_bin(const vector_uchar &text)
Sets the HashVal from a 16-byte binary string.
void output_hex(std::ostream &out) const
Outputs the HashVal as a 32-digit hexadecimal number.
void add_be_uint32(uint32_t value)
Adds an unsigned 32-bit big-endian integer to the streamWriter.
static void close_read_file(std::istream *stream)
Closes a file opened by a previous call to open_read_file().
void input_binary(std::istream &in)
Inputs the HashVal as a binary stream of bytes in order.
The name of a file, such as a texture file or an Egg file.
void input_hex(std::istream &in)
Inputs the HashVal as a 32-digit hexadecimal number.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
uint32_t get_be_uint32()
Extracts an unsigned big-endian 32-bit integer.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A class to retrieve the individual data elements previously stored in a Datagram. ...
A class to read sequential binary data directly from an istream.
void output_binary(std::ostream &out) const
Outputs the HashVal as a binary stream of bytes in order.
std::string as_hex() const
Returns the HashVal as a 32-byte hexadecimal string.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
bool set_from_hex(const std::string &text)
Sets the HashVal from a 32-byte hexademical string.
size_t get_length() const
Returns the number of bytes in the datagram.
vector_uchar as_bin() const
Returns the HashVal as a 16-byte binary string.
std::string as_dec() const
Returns the HashVal as a string with four decimal numbers.
void input_dec(std::istream &in)
Inputs the HashVal as four unsigned decimal integers.
const void * get_data() const
Returns a pointer to the beginning of the datagram's data.