
On Mon, Dec 9, 2024 at 9:41 AM Vinnie Falco <vinnie.falco@gmail.com> wrote:
I think it would be preferable if Hash2 made this the default implementation, and allowed more sophisticated algorithms (and authors) to opt-in to a better implementation. Otherwise, we are forcing ordinary users who just want to adapt an external library to meet the HashAlgorithm requirements to become experts.
Peter, would you please comment on the following sketch: /** HashAlgorithm exemplar */ struct HashAlgorithm { using result_type = /* integral or array-like */; HashAlgorithm(); HashAlgorithm( HashAlgorithm const& r ); HashAlgorithm& operator=( HashAlgorithm const& r ); /** Append data to the message The behavior of subsequent calls to update() after finalize() has been called at least once is undefined unless specified by the HashAlgorithm. */ void update( void const* data, std::size_t n ); /** Return the digest This function shall return the final hash value of the input message, where the input message is defined by the ordered sequence of bytes provided in all prior calls to update(). The behavior of subsequent calls to finalize() is undefined unless specified by the HashAlgorithm. */ result_type finalize(); static constexpr int block_size = /*...*/; // optional explicit HashAlgorithm( std::uint64_t seed ); // optional HashAlgorithm( unsigned char const* seed, std::size_t n ); // optional }; /** Return a seeded HashAlgorithm */ template< class HashAlgorithm > HashAlgorithm make_seeded( std::uint64_t seed ) { if constexpr(std::is_constructible< HashAlgorithm, std::uint64_t>) return HashAlgorithm(seed); else { HashAlgorithm h; hash_append(h, seed); return h; } } /** Return a seeded HashAlgorithm */ template< class HashAlgorithm > HashAlgorithm make_seeded( unsigned char const* seed, std::size_t n ) { if constexpr(std::is_constructible<HashAlgorithm, unsigned char const*, std::size_t>) return HashAlgorithm(seed); else { HashAlgorithm h; hash_append(h, seed); return h; } } Thanks