mirror of
https://git.wownero.com/wownero/wownero.git
synced 2024-08-15 01:03:23 +00:00
Improvements for epee binary to hex functions:
- Performance improvements - Added `span` for zero-copy pointer+length arguments - Added `std::ostream` overload for direct writing to output buffers - Removal of unused `string_tools::buff_to_hex`
This commit is contained in:
parent
9ed496bbc5
commit
4a8f96f95d
14 changed files with 767 additions and 76 deletions
|
@ -26,7 +26,7 @@
|
|||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
add_library(epee STATIC http_auth.cpp mlog.cpp string_tools.cpp)
|
||||
add_library(epee STATIC hex.cpp http_auth.cpp mlog.cpp string_tools.cpp)
|
||||
# Build and install libepee if we're building for GUI
|
||||
if (BUILD_GUI_DEPS)
|
||||
if(IOS)
|
||||
|
|
82
contrib/epee/src/hex.cpp
Normal file
82
contrib/epee/src/hex.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
// Copyright (c) 2017, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "hex.h"
|
||||
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <ostream>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace epee
|
||||
{
|
||||
namespace
|
||||
{
|
||||
template<typename T>
|
||||
void write_hex(T&& out, const view<std::uint8_t> src)
|
||||
{
|
||||
static constexpr const char hex[] = u8"0123456789abcdef";
|
||||
static_assert(sizeof(hex) == 17, "bad string size");
|
||||
for (const std::uint8_t byte : src)
|
||||
{
|
||||
*out = hex[byte >> 4];
|
||||
++out;
|
||||
*out = hex[byte & 0x0F];
|
||||
++out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string to_hex::string(const view<std::uint8_t> src)
|
||||
{
|
||||
if (std::numeric_limits<std::size_t>::max() / 2 < src.size())
|
||||
throw std::range_error("hex_view::to_string exceeded maximum size");
|
||||
|
||||
std::string out{};
|
||||
out.resize(src.size() * 2);
|
||||
buffer_unchecked(std::addressof(out[0]), src);
|
||||
return out;
|
||||
}
|
||||
|
||||
void to_hex::buffer(std::ostream& out, const view<std::uint8_t> src)
|
||||
{
|
||||
write_hex(std::ostreambuf_iterator<char>{out}, src);
|
||||
}
|
||||
|
||||
void to_hex::formatted(std::ostream& out, const view<std::uint8_t> src)
|
||||
{
|
||||
out.put('<');
|
||||
buffer(out, src);
|
||||
out.put('>');
|
||||
}
|
||||
|
||||
void to_hex::buffer_unchecked(char* out, const view<std::uint8_t> src) noexcept
|
||||
{
|
||||
return write_hex(out, src);
|
||||
}
|
||||
}
|
|
@ -67,6 +67,7 @@
|
|||
#include <type_traits>
|
||||
|
||||
#include "crypto/crypto.h"
|
||||
#include "hex.h"
|
||||
#include "md5_l.h"
|
||||
#include "string_coding.h"
|
||||
|
||||
|
@ -104,25 +105,6 @@ namespace
|
|||
|
||||
//// Digest Algorithms
|
||||
|
||||
template<std::size_t N>
|
||||
std::array<char, N * 2> to_hex(const std::array<std::uint8_t, N>& digest) noexcept
|
||||
{
|
||||
static constexpr const char alphabet[] = u8"0123456789abcdef";
|
||||
static_assert(sizeof(alphabet) == 17, "bad alphabet size");
|
||||
|
||||
// TODO upgrade (improve performance) of to hex in epee string tools
|
||||
std::array<char, N * 2> out{{}};
|
||||
auto current = out.begin();
|
||||
for (const std::uint8_t byte : digest)
|
||||
{
|
||||
*current = alphabet[byte >> 4];
|
||||
++current;
|
||||
*current = alphabet[byte & 0x0F];
|
||||
++current;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
struct md5_
|
||||
{
|
||||
static constexpr const boost::string_ref name = ceref(u8"MD5");
|
||||
|
@ -156,7 +138,7 @@ namespace
|
|||
|
||||
std::array<std::uint8_t, 16> digest{{}};
|
||||
md5::MD5Final(digest.data(), std::addressof(ctx));
|
||||
return to_hex(digest);
|
||||
return epee::to_hex::array(digest);
|
||||
}
|
||||
};
|
||||
constexpr const boost::string_ref md5_::name;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue