diff --git a/libraries/fc/include/fc/crypto/signature.hpp b/libraries/fc/include/fc/crypto/signature.hpp index c6aedbb7f0fc64adb9866921deea45b9c11b668b..73300ad372903743faece8947cc0f15fdc94ebaf 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 53be40eadc91ff5a3b40b70f4f89a687de8b25b5..1ad704faa7738885dc7eb7baaf3b710086aedc0c 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