md5.h (2557B)
1 #pragma once 2 3 #include <array> 4 #include <cassert> 5 #include <cstdint> 6 #include <string> 7 #include <vector> 8 9 namespace baseLib 10 { 11 class MD5 12 { 13 public: 14 static constexpr uint32_t parse1(const char _b) 15 { 16 if (_b >= '0' && _b <= '9') 17 return _b - '0'; 18 if (_b >= 'A' && _b <= 'F') 19 return _b - 'A' + 10; 20 if (_b >= 'a' && _b <= 'f') 21 return _b - 'a' + 10; 22 assert(false); 23 return 0; 24 } 25 static constexpr uint32_t parse2(const char _b0, const char _b1) 26 { 27 return parse1(_b1) << 4 | parse1(_b0); 28 } 29 static constexpr uint32_t parse4(const char _b0, const char _b1, const char _b2, const char _b3) 30 { 31 return parse2(_b3, _b2) << 8 | parse2(_b1, _b0); 32 } 33 static constexpr uint32_t parse8(const char _b0, const char _b1, const char _b2, const char _b3, const char _b4, const char _b5, const char _b6, const char _b7) 34 { 35 return parse4(_b4, _b5, _b6, _b7) << 16 | parse4(_b0, _b1, _b2, _b3); 36 } 37 38 template<size_t N, std::enable_if_t<N == 33, void*> = nullptr> constexpr MD5(char const(&_digest)[N]) 39 : m_h 40 { 41 parse8(_digest[ 0], _digest[ 1], _digest[ 2], _digest[ 3], _digest[ 4], _digest[ 5], _digest[ 6], _digest[ 7]), 42 parse8(_digest[ 8], _digest[ 9], _digest[10], _digest[11], _digest[12], _digest[13], _digest[14], _digest[15]), 43 parse8(_digest[16], _digest[17], _digest[18], _digest[19], _digest[20], _digest[21], _digest[22], _digest[23]), 44 parse8(_digest[24], _digest[25], _digest[26], _digest[27], _digest[28], _digest[29], _digest[30], _digest[31]) 45 } 46 { 47 } 48 49 explicit MD5(const std::vector<uint8_t>& _data); 50 explicit MD5(const uint8_t* _data, uint32_t _size); 51 52 MD5() : m_h({0,0,0,0}) {} 53 54 MD5(const MD5& _src) = default; 55 MD5(MD5&& _src) = default; 56 57 ~MD5() = default; 58 59 MD5& operator = (const MD5&) = default; 60 MD5& operator = (MD5&&) = default; 61 62 std::string toString() const; 63 64 constexpr bool operator == (const MD5& _md5) const 65 { 66 return m_h[0] == _md5.m_h[0] && m_h[1] == _md5.m_h[1] && m_h[2] == _md5.m_h[2] && m_h[3] == _md5.m_h[3]; 67 } 68 69 constexpr bool operator != (const MD5& _md5) const 70 { 71 return !(*this == _md5); 72 } 73 74 constexpr bool operator < (const MD5& _md5) const 75 { 76 if(m_h[0] < _md5.m_h[0]) return true; 77 if(m_h[0] > _md5.m_h[0]) return false; 78 if(m_h[1] < _md5.m_h[1]) return true; 79 if(m_h[1] > _md5.m_h[1]) return false; 80 if(m_h[2] < _md5.m_h[2]) return true; 81 if(m_h[2] > _md5.m_h[2]) return false; 82 if(m_h[3] < _md5.m_h[3]) return true; 83 /*if(m_h[3] > _md5.m_h[3])*/ return false; 84 } 85 86 private: 87 std::array<uint32_t, 4> m_h; 88 }; 89 }