diff options
Diffstat (limited to 'src/lib/util/hashing.h')
-rw-r--r-- | src/lib/util/hashing.h | 173 |
1 files changed, 112 insertions, 61 deletions
diff --git a/src/lib/util/hashing.h b/src/lib/util/hashing.h index b1505c654a4..c57d403de1b 100644 --- a/src/lib/util/hashing.h +++ b/src/lib/util/hashing.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles, Vas Crabb /*************************************************************************** hashing.h @@ -7,22 +7,23 @@ Hashing helper classes. ***************************************************************************/ - #ifndef MAME_UTIL_HASHING_H #define MAME_UTIL_HASHING_H #pragma once -#include "osdcore.h" -#include "corestr.h" #include "md5.h" -#include "sha1.h" +#include <array> +#include <cstdint> +#include <cstring> #include <functional> #include <string> +#include <string_view> namespace util { + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -33,10 +34,10 @@ namespace util { // final digest struct sha1_t { - bool operator==(const sha1_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) == 0; } - bool operator!=(const sha1_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; } - operator uint8_t *() { return m_raw; } - bool from_string(const char *string, int length = -1); + bool operator==(const sha1_t &rhs) const noexcept { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) == 0; } + bool operator!=(const sha1_t &rhs) const noexcept { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; } + operator uint8_t *() noexcept { return m_raw; } + bool from_string(std::string_view string) noexcept; std::string as_string() const; uint8_t m_raw[20]; static const sha1_t null; @@ -47,25 +48,19 @@ class sha1_creator { public: // construction/destruction - sha1_creator() { reset(); } + sha1_creator() noexcept { reset(); } // reset - void reset() { sha1_init(&m_context); } + void reset() noexcept; // append data - void append(const void *data, uint32_t length) { sha1_update(&m_context, length, reinterpret_cast<const uint8_t *>(data)); } + void append(const void *data, uint32_t length) noexcept; // finalize and compute the final digest - sha1_t finish() - { - sha1_t result; - sha1_final(&m_context); - sha1_digest(&m_context, sizeof(result.m_raw), result.m_raw); - return result; - } + sha1_t finish() noexcept; // static wrapper to just get the digest from a block - static sha1_t simple(const void *data, uint32_t length) + static sha1_t simple(const void *data, uint32_t length) noexcept { sha1_creator creator; creator.append(data, length); @@ -73,8 +68,9 @@ public: } protected: - // internal state - struct sha1_ctx m_context; // internal context + uint64_t m_cnt; + std::array<uint32_t, 5> m_st; + uint32_t m_buf[16]; }; @@ -84,10 +80,10 @@ protected: // final digest struct md5_t { - bool operator==(const md5_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) == 0; } - bool operator!=(const md5_t &rhs) const { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; } - operator uint8_t *() { return m_raw; } - bool from_string(const char *string, int length = -1); + bool operator==(const md5_t &rhs) const noexcept { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) == 0; } + bool operator!=(const md5_t &rhs) const noexcept { return memcmp(m_raw, rhs.m_raw, sizeof(m_raw)) != 0; } + operator uint8_t *() noexcept { return m_raw; } + bool from_string(std::string_view string) noexcept; std::string as_string() const; uint8_t m_raw[16]; static const md5_t null; @@ -98,16 +94,16 @@ class md5_creator { public: // construction/destruction - md5_creator() { reset(); } + md5_creator() noexcept { reset(); } // reset - void reset() { MD5Init(&m_context); } + void reset() noexcept { MD5Init(&m_context); } // append data - void append(const void *data, uint32_t length) { MD5Update(&m_context, reinterpret_cast<const unsigned char *>(data), length); } + void append(const void *data, uint32_t length) noexcept { MD5Update(&m_context, reinterpret_cast<const unsigned char *>(data), length); } // finalize and compute the final digest - md5_t finish() + md5_t finish() noexcept { md5_t result; MD5Final(result.m_raw, &m_context); @@ -115,7 +111,7 @@ public: } // static wrapper to just get the digest from a block - static md5_t simple(const void *data, uint32_t length) + static md5_t simple(const void *data, uint32_t length) noexcept { md5_creator creator; creator.append(data, length); @@ -134,19 +130,19 @@ protected: // final digest struct crc32_t { - crc32_t() { } - constexpr crc32_t(const crc32_t &rhs) = default; - constexpr crc32_t(const uint32_t crc) : m_raw(crc) { } + crc32_t() noexcept { } + constexpr crc32_t(const crc32_t &rhs) noexcept = default; + constexpr crc32_t(const uint32_t crc) noexcept : m_raw(crc) { } - constexpr bool operator==(const crc32_t &rhs) const { return m_raw == rhs.m_raw; } - constexpr bool operator!=(const crc32_t &rhs) const { return m_raw != rhs.m_raw; } + constexpr bool operator==(const crc32_t &rhs) const noexcept { return m_raw == rhs.m_raw; } + constexpr bool operator!=(const crc32_t &rhs) const noexcept { return m_raw != rhs.m_raw; } - crc32_t &operator=(const crc32_t &rhs) = default; - crc32_t &operator=(const uint32_t crc) { m_raw = crc; return *this; } + crc32_t &operator=(const crc32_t &rhs) noexcept = default; + crc32_t &operator=(const uint32_t crc) noexcept { m_raw = crc; return *this; } - constexpr operator uint32_t() const { return m_raw; } + constexpr operator uint32_t() const noexcept { return m_raw; } - bool from_string(const char *string, int length = -1); + bool from_string(std::string_view string) noexcept; std::string as_string() const; uint32_t m_raw; @@ -159,19 +155,19 @@ class crc32_creator { public: // construction/destruction - crc32_creator() { reset(); } + crc32_creator() noexcept { reset(); } // reset - void reset() { m_accum.m_raw = 0; } + void reset() noexcept { m_accum.m_raw = 0; } // append data - void append(const void *data, uint32_t length); + void append(const void *data, uint32_t length) noexcept; // finalize and compute the final digest - crc32_t finish() { return m_accum; } + crc32_t finish() noexcept { return m_accum; } // static wrapper to just get the digest from a block - static crc32_t simple(const void *data, uint32_t length) + static crc32_t simple(const void *data, uint32_t length) noexcept { crc32_creator creator; creator.append(data, length); @@ -190,19 +186,19 @@ protected: // final digest struct crc16_t { - crc16_t() { } - constexpr crc16_t(const crc16_t &rhs) = default; - constexpr crc16_t(const uint16_t crc) : m_raw(crc) { } + crc16_t() noexcept { } + constexpr crc16_t(const crc16_t &rhs) noexcept = default; + constexpr crc16_t(const uint16_t crc) noexcept : m_raw(crc) { } - constexpr bool operator==(const crc16_t &rhs) const { return m_raw == rhs.m_raw; } - constexpr bool operator!=(const crc16_t &rhs) const { return m_raw != rhs.m_raw; } + constexpr bool operator==(const crc16_t &rhs) const noexcept { return m_raw == rhs.m_raw; } + constexpr bool operator!=(const crc16_t &rhs) const noexcept { return m_raw != rhs.m_raw; } - crc16_t &operator=(const crc16_t &rhs) = default; - crc16_t &operator=(const uint16_t crc) { m_raw = crc; return *this; } + crc16_t &operator=(const crc16_t &rhs) noexcept = default; + crc16_t &operator=(const uint16_t crc) noexcept { m_raw = crc; return *this; } - constexpr operator uint16_t() const { return m_raw; } + constexpr operator uint16_t() const noexcept { return m_raw; } - bool from_string(const char *string, int length = -1); + bool from_string(std::string_view string) noexcept; std::string as_string() const; uint16_t m_raw; @@ -215,19 +211,19 @@ class crc16_creator { public: // construction/destruction - crc16_creator() { reset(); } + crc16_creator() noexcept { reset(); } // reset - void reset() { m_accum.m_raw = 0xffff; } + void reset() noexcept { m_accum.m_raw = 0xffff; } // append data - void append(const void *data, uint32_t length); + void append(const void *data, uint32_t length) noexcept; // finalize and compute the final digest - crc16_t finish() { return m_accum; } + crc16_t finish() noexcept { return m_accum; } // static wrapper to just get the digest from a block - static crc16_t simple(const void *data, uint32_t length) + static crc16_t simple(const void *data, uint32_t length) noexcept { crc16_creator creator; creator.append(data, length); @@ -240,6 +236,61 @@ protected: }; + +// ======================> SUM-16 + +// final digest +struct sum16_t +{ + sum16_t() noexcept { } + constexpr sum16_t(const sum16_t &rhs) noexcept = default; + constexpr sum16_t(const uint16_t sum) noexcept : m_raw(sum) { } + + constexpr bool operator==(const sum16_t &rhs) const noexcept { return m_raw == rhs.m_raw; } + constexpr bool operator!=(const sum16_t &rhs) const noexcept { return m_raw != rhs.m_raw; } + + sum16_t &operator=(const sum16_t &rhs) noexcept = default; + sum16_t &operator=(const uint16_t sum) noexcept { m_raw = sum; return *this; } + + constexpr operator uint16_t() const noexcept { return m_raw; } + + bool from_string(std::string_view string) noexcept; + std::string as_string() const; + + uint16_t m_raw; + + static const sum16_t null; +}; + +// creation helper +class sum16_creator +{ +public: + // construction/destruction + sum16_creator() noexcept { reset(); } + + // reset + void reset() noexcept { m_accum.m_raw = 0; } + + // append data + void append(const void *data, uint32_t length) noexcept; + + // finalize and compute the final digest + sum16_t finish() noexcept { return m_accum; } + + // static wrapper to just get the digest from a block + static sum16_t simple(const void *data, uint32_t length) noexcept + { + sum16_creator creator; + creator.append(data, length); + return creator.finish(); + } + +protected: + // internal state + sum16_t m_accum; // internal accumulator +}; + } // namespace util namespace std { @@ -248,14 +299,14 @@ template <> struct hash<::util::crc32_t> { typedef ::util::crc32_t argument_type; typedef std::size_t result_type; - result_type operator()(argument_type const & s) const { return std::hash<std::uint32_t>()(s); } + result_type operator()(argument_type const &s) const noexcept { return std::hash<std::uint32_t>()(s); } }; template <> struct hash<::util::crc16_t> { typedef ::util::crc16_t argument_type; typedef std::size_t result_type; - result_type operator()(argument_type const & s) const { return std::hash<std::uint16_t>()(s); } + result_type operator()(argument_type const &s) const noexcept { return std::hash<std::uint16_t>()(s); } }; } // namespace std |