From 0118e5ea5d4f08553f3876976296e2547ed69571 Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Tue, 5 Aug 2025 02:20:28 +0300 Subject: [PATCH] libutil: Move Ctx type from the nix namespace to Hash class Same as previous commit. This really should not be a part of the `nix` namespace. Otherwise the doxygen documentation is really confusing. --- src/libutil/hash.cc | 14 +++++++------- src/libutil/include/nix/util/hash.hh | 7 ++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc index 38ef5dd90..941224d58 100644 --- a/src/libutil/hash.cc +++ b/src/libutil/hash.cc @@ -273,7 +273,7 @@ Hash newHashAllowEmpty(std::string_view hashStr, std::optional ha return Hash::parseAny(hashStr, ha); } -union Ctx +union Hash::Ctx { blake3_hasher blake3; MD5_CTX md5; @@ -282,7 +282,7 @@ union Ctx SHA512_CTX sha512; }; -static void start(HashAlgorithm ha, Ctx & ctx) +static void start(HashAlgorithm ha, Hash::Ctx & ctx) { if (ha == HashAlgorithm::BLAKE3) blake3_hasher_init(&ctx.blake3); @@ -317,7 +317,7 @@ void blake3_hasher_update_with_heuristics(blake3_hasher * blake3, std::string_vi } } -static void update(HashAlgorithm ha, Ctx & ctx, std::string_view data) +static void update(HashAlgorithm ha, Hash::Ctx & ctx, std::string_view data) { if (ha == HashAlgorithm::BLAKE3) blake3_hasher_update_with_heuristics(&ctx.blake3, data); @@ -331,7 +331,7 @@ static void update(HashAlgorithm ha, Ctx & ctx, std::string_view data) SHA512_Update(&ctx.sha512, data.data(), data.size()); } -static void finish(HashAlgorithm ha, Ctx & ctx, unsigned char * hash) +static void finish(HashAlgorithm ha, Hash::Ctx & ctx, unsigned char * hash) { if (ha == HashAlgorithm::BLAKE3) blake3_hasher_finalize(&ctx.blake3, hash, BLAKE3_OUT_LEN); @@ -347,7 +347,7 @@ static void finish(HashAlgorithm ha, Ctx & ctx, unsigned char * hash) Hash hashString(HashAlgorithm ha, std::string_view s, const ExperimentalFeatureSettings & xpSettings) { - Ctx ctx; + Hash::Ctx ctx; Hash hash(ha, xpSettings); start(ha, ctx); update(ha, ctx, s); @@ -365,7 +365,7 @@ Hash hashFile(HashAlgorithm ha, const Path & path) HashSink::HashSink(HashAlgorithm ha) : ha(ha) { - ctx = new Ctx; + ctx = new Hash::Ctx; bytes = 0; start(ha, *ctx); } @@ -393,7 +393,7 @@ HashResult HashSink::finish() HashResult HashSink::currentHash() { flush(); - Ctx ctx2 = *ctx; + Hash::Ctx ctx2 = *ctx; Hash hash(ha); nix::finish(ha, ctx2, hash.hash); return HashResult(hash, bytes); diff --git a/src/libutil/include/nix/util/hash.hh b/src/libutil/include/nix/util/hash.hh index daacd7adf..584ab6899 100644 --- a/src/libutil/include/nix/util/hash.hh +++ b/src/libutil/include/nix/util/hash.hh @@ -57,6 +57,9 @@ extern const StringSet hashFormats; struct Hash { + /** Opaque handle type for the hash calculation state. */ + union Ctx; + constexpr static size_t maxHashSize = 64; size_t hashSize = 0; uint8_t hash[maxHashSize] = {}; @@ -224,8 +227,6 @@ std::optional parseHashAlgoOpt(std::string_view s); */ std::string_view printHashAlgo(HashAlgorithm ha); -union Ctx; - struct AbstractHashSink : virtual Sink { virtual HashResult finish() = 0; @@ -235,7 +236,7 @@ class HashSink : public BufferedSink, public AbstractHashSink { private: HashAlgorithm ha; - Ctx * ctx; + Hash::Ctx * ctx; uint64_t bytes; public: