From 9eb3e125b61df41d54c4cf0c017e4c186def0951 Mon Sep 17 00:00:00 2001 From: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com> Date: Thu, 14 Dec 2017 11:44:21 -0500 Subject: [PATCH] add a hash_value() for fc::cryto::signature This is for usage in a container; not a cryptograhic hash or such --- libraries/fc/include/fc/crypto/signature.hpp | 1 + libraries/fc/src/crypto/signature.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/libraries/fc/include/fc/crypto/signature.hpp b/libraries/fc/include/fc/crypto/signature.hpp index c6aedbb7f..73300ad37 100644 --- a/libraries/fc/include/fc/crypto/signature.hpp +++ b/libraries/fc/include/fc/crypto/signature.hpp @@ -38,6 +38,7 @@ namespace fc { namespace crypto { friend bool operator == ( const signature& p1, const signature& p2); friend bool operator != ( const signature& p1, const signature& p2); friend bool operator < ( const signature& p1, const signature& p2); + friend std::size_t hash_value(const signature& b); //not cryptographic; for containers friend struct reflector; friend class private_key; friend class public_key; diff --git a/libraries/fc/src/crypto/signature.cpp b/libraries/fc/src/crypto/signature.cpp index 53be40ead..1ad704faa 100644 --- a/libraries/fc/src/crypto/signature.cpp +++ b/libraries/fc/src/crypto/signature.cpp @@ -3,6 +3,15 @@ #include namespace fc { namespace crypto { + struct hash_visitor : public fc::visitor { + template + size_t operator()(const SigType& sig) const { + static_assert(sizeof(sig._data.data) == 65, "sig size is expected to be 65"); + //signatures are two bignums: r & s. Just add up least significant digits of the two + return *(size_t*)&sig._data.data[32-sizeof(size_t)] + *(size_t*)&sig._data.data[64-sizeof(size_t)]; + } + }; + static signature::storage_type parse_base58(const std::string& base58str) { constexpr auto prefix = config::signature_base_prefix; @@ -53,6 +62,10 @@ namespace fc { namespace crypto { { return less_comparator::apply(p1._storage, p2._storage); } + + size_t hash_value(const signature& b) { + return b._storage.visit(hash_visitor()); + } } } // eosio::blockchain namespace fc -- GitLab