annotate foosdk/sdk/foobar2000/SDK/hasher_md5.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "filesystem.h" // FB2K_STREAM_READER_OVERLOAD, FB2K_STREAM_WRITER_OVERLOAD
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 struct hasher_md5_state {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 char m_data[128];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 struct hasher_md5_result {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 char m_data[16];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 t_uint64 xorHalve() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 GUID asGUID() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 pfc::string8 asString() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 pfc::string8 toString() const { return asString(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 GUID toGUID() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 static hasher_md5_result null() {hasher_md5_result h = {}; return h;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 static int compare(hasher_md5_result const & h1, hasher_md5_result const & h2) { return memcmp(&h1, &h2, sizeof(hasher_md5_result)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 FB2K_STREAM_READER_OVERLOAD(hasher_md5_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 stream.read_raw(&value, sizeof(value)); return stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 FB2K_STREAM_WRITER_OVERLOAD(hasher_md5_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 stream.write_raw(&value, sizeof(value)); return stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 inline bool operator==(const hasher_md5_result & p_item1,const hasher_md5_result & p_item2) {return memcmp(&p_item1,&p_item2,sizeof(hasher_md5_result)) == 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 inline bool operator!=(const hasher_md5_result & p_item1,const hasher_md5_result & p_item2) {return memcmp(&p_item1,&p_item2,sizeof(hasher_md5_result)) != 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 inline bool operator>(const hasher_md5_result & p_item1, const hasher_md5_result & p_item2) { return memcmp(&p_item1, &p_item2, sizeof(hasher_md5_result)) > 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 inline bool operator<(const hasher_md5_result & p_item1, const hasher_md5_result & p_item2) { return memcmp(&p_item1, &p_item2, sizeof(hasher_md5_result)) < 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 template<> class traits_t<hasher_md5_state> : public traits_rawobject {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 template<> class traits_t<hasher_md5_result> : public traits_rawobject {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 template<> inline int compare_t(const hasher_md5_result & p_item1, const hasher_md5_result & p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return memcmp(&p_item1, &p_item2, sizeof(hasher_md5_result));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class NOVTABLE hasher_md5 : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 virtual void initialize(hasher_md5_state & p_state) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 virtual void process(hasher_md5_state & p_state,const void * p_buffer,t_size p_bytes) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 virtual hasher_md5_result get_result(const hasher_md5_state & p_state) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 static GUID guid_from_result(const hasher_md5_result & param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 hasher_md5_result process_single(const void * p_buffer,t_size p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 hasher_md5_result process_single_string(const char * str) {return process_single(str, strlen(str));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 GUID process_single_guid(const void * p_buffer,t_size p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 GUID get_result_guid(const hasher_md5_state & p_state) {return guid_from_result(get_result(p_state));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! Helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void process_string(hasher_md5_state & p_state,const char * p_string,t_size p_length = ~0) {return process(p_state,p_string,pfc::strlen_max(p_string,p_length));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 hasher_md5_state initialize() { hasher_md5_state ret; initialize(ret); return ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 FB2K_MAKE_SERVICE_COREAPI(hasher_md5);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 class stream_writer_hasher_md5 : public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 stream_writer_hasher_md5() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 m_hasher->initialize(m_state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 m_hasher->process(m_state,p_buffer,p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 hasher_md5_result result() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return m_hasher->get_result(m_state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 GUID resultGuid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return hasher_md5::guid_from_result(result());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 hasher_md5_state m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 const hasher_md5::ptr m_hasher = hasher_md5::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 template<bool isBigEndian = false>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 class stream_formatter_hasher_md5 : public stream_writer_formatter<isBigEndian> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 stream_formatter_hasher_md5() : stream_writer_formatter<isBigEndian>(_m_stream,fb2k::noAbort) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 hasher_md5_result result() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 return _m_stream.result();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 GUID resultGuid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 return hasher_md5::guid_from_result(result());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 stream_writer_hasher_md5 _m_stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 };