diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2016-05-22 11:06:18 +0200 |
---|---|---|
committer | Pieter Wuille <pieter.wuille@gmail.com> | 2016-06-07 16:20:40 +0200 |
commit | 9bf156bb9ee4915fa7e8f84589d65f6598563c97 (patch) | |
tree | c9be046c2bcc72f0bb80d97e09543e633e68da04 /src/hash.h | |
parent | 053930ffc41ba33fe7ce26bde7097951fe0b8462 (diff) |
Support SipHash with arbitrary byte writes
Diffstat (limited to 'src/hash.h')
-rw-r--r-- | src/hash.h | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/hash.h b/src/hash.h index 600dabec56..db4e130ae7 100644 --- a/src/hash.h +++ b/src/hash.h @@ -171,19 +171,38 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]); -/** SipHash-2-4, using a uint64_t-based (rather than byte-based) interface */ +/** SipHash-2-4 */ class CSipHasher { private: uint64_t v[4]; + uint64_t tmp; int count; 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); #endif // BITCOIN_HASH_H |