LCOV - code coverage report
Current view: top level - src - hash.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 43 47 91.5 %
Date: 2026-06-25 07:23:43 Functions: 3 4 75.0 %

          Line data    Source code
       1             : // Copyright (c) 2013-2021 The Bitcoin Core developers
       2             : // Distributed under the MIT software license, see the accompanying
       3             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4             : 
       5             : #include <hash.h>
       6             : #include <span.h>
       7             : #include <crypto/common.h>
       8             : #include <crypto/hmac_sha512.h>
       9             : 
      10             : #include <bit>
      11             : #include <string>
      12             : 
      13    22284787 : unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vDataToHash)
      14             : {
      15             :     // The following is MurmurHash3 (x86_32), see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
      16    22284787 :     uint32_t h1 = nHashSeed;
      17    22284787 :     const uint32_t c1 = 0xcc9e2d51;
      18    22284787 :     const uint32_t c2 = 0x1b873593;
      19             : 
      20    22284787 :     const int nblocks = vDataToHash.size() / 4;
      21             : 
      22             :     //----------
      23             :     // body
      24    22284787 :     const uint8_t* blocks = vDataToHash.data();
      25             : 
      26   198313194 :     for (int i = 0; i < nblocks; ++i) {
      27   176028407 :         uint32_t k1 = ReadLE32(blocks + i*4);
      28             : 
      29   176028407 :         k1 *= c1;
      30   176028407 :         k1 = std::rotl(k1, 15);
      31   176028407 :         k1 *= c2;
      32             : 
      33   176028407 :         h1 ^= k1;
      34   176028407 :         h1 = std::rotl(h1, 13);
      35   176028407 :         h1 = h1 * 5 + 0xe6546b64;
      36   176028407 :     }
      37             : 
      38             :     //----------
      39             :     // tail
      40    22284787 :     const uint8_t* tail = vDataToHash.data() + nblocks * 4;
      41             : 
      42    22284787 :     uint32_t k1 = 0;
      43             : 
      44    22284787 :     switch (vDataToHash.size() & 3) {
      45             :         case 3:
      46          21 :             k1 ^= tail[2] << 16;
      47             :             [[fallthrough]];
      48             :         case 2:
      49      483023 :             k1 ^= tail[1] << 8;
      50             :             [[fallthrough]];
      51             :         case 1:
      52      483426 :             k1 ^= tail[0];
      53      483426 :             k1 *= c1;
      54      483426 :             k1 = std::rotl(k1, 15);
      55      483426 :             k1 *= c2;
      56      483426 :             h1 ^= k1;
      57      483426 :     }
      58             : 
      59             :     //----------
      60             :     // finalization
      61    22284787 :     h1 ^= vDataToHash.size();
      62    22284787 :     h1 ^= h1 >> 16;
      63    22284787 :     h1 *= 0x85ebca6b;
      64    22284787 :     h1 ^= h1 >> 13;
      65    22284787 :     h1 *= 0xc2b2ae35;
      66    22284787 :     h1 ^= h1 >> 16;
      67             : 
      68    22284787 :     return h1;
      69             : }
      70             : 
      71      720664 : void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
      72             : {
      73             :     unsigned char num[4];
      74      720664 :     WriteBE32(num, nChild);
      75      720664 :     CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output);
      76      720664 : }
      77             : 
      78           0 : uint256 SHA256Uint256(const uint256& input)
      79             : {
      80           0 :     uint256 result;
      81           0 :     CSHA256().Write(input.begin(), 32).Finalize(result.begin());
      82           0 :     return result;
      83             : }
      84             : 
      85        3308 : HashWriter TaggedHash(const std::string& tag)
      86             : {
      87        3308 :     HashWriter writer{};
      88        3308 :     uint256 taghash;
      89        3308 :     CSHA256().Write((const unsigned char*)tag.data(), tag.size()).Finalize(taghash.begin());
      90        3308 :     writer << taghash << taghash;
      91        3308 :     return writer;
      92             : }

Generated by: LCOV version 1.16