text: // Copyright (c) 2016-2018 The Dnxcoin Core developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef BITCOIN_CRYPTO_SIPHASH_H
  #define BITCOIN_CRYPTO_SIPHASH_H
  
  #include <stdint.h>
  
  #include <uint256.h>
  
  /** SipHash-2-4 */
  class CSipHasher
  {
  private:
      uint64_t v[4];
      uint64_t tmp;
      uint8_t count; // Only the low 8 bits of the input size matter.
  
  public:
      /** Construct a SipHash calculator initialized with 128-bit key (k0, k1) */
      CSipHasher(uint64_t k0, uint64_t k1);
      /** Hash a 64-bit integer worth of data
       *  It is treated as if this was the little-endian interpretation of 8 bytes.
       *  This function can only be used when a multiple of 8 bytes have been written so far.
       */
      CSipHasher& Write(uint64_t data);
      /** Hash arbitrary bytes. */
      CSipHasher& Write(const unsigned char* data, size_t size);
      /** Compute the 64-bit SipHash-2-4 of the data written so far. The object remains untouched. */
      uint64_t Finalize() const;
  };
  
  /** Optimized SipHash-2-4 implementation for uint256.
   *
   *  It is identical to:
   *    SipHasher(k0, k1)
   *      .Write(val.GetUint64(0))
   *      .Write(val.GetUint64(1))
   *      .Write(val.GetUint64(2))
   *      .Write(val.GetUint64(3))
   *      .Finalize()
   */
  uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val);
  uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra);
  
  #endif // BITCOIN_CRYPTO_SIPHASH_H
  