Boost logo

Boost :

From: Vinnie Falco (vinnie.falco_at_[hidden])
Date: 2024-12-06 15:44:38


On Thu, Dec 5, 2024 at 12:06 PM Vinnie Falco <vinnie.falco_at_[hidden]> wrote:

> ...Instead of writing:
>
> h.update( span );
>
> You instead write:
>
> boost::hash2::update( h, span );
>

Anyway it looks like this wasn't clear so I guess I'll try again and be
even more explicit. Currently, the hash algorithm provides the following
member function for sending a contiguous range of binary data:

    void update( void const*, std::size_t );

The combination of pointer and size passed as individual arguments is
triggering to certain folks, who instead prefer the following, or some
variation of it (for example, using uint8_t instead of byte)

    void update( std::span< std::byte const > );

This is disfavored by the library author (and myself) for reasons already
posted to the mailing list which I will not repeat. Yet an argument can be
made that the use of a span could be favorable to tooling which performs
buffer safety analysis. Thus I propose to add the following additional free
function. Doing so allows authors of hash functions to call the free
function with a span instead of the update member function which accepts a
pointer and size, without burdening the authors of hash algorithms:

    namespace boost::hash2 {
        template< typename Hasher >
        void update( Hasher& h, std::span< std::byte const > s ) {
            h.update( s.data(), s.size() );
        }
    }

I have to stress that this is not the same as the hash_append function
which by coincidence has an identical signature (and different
implementation). This is the alternative to: 1. changing the signature of
update in the Hasher concept, or 2. adding an overload of update to the
Hasher concept (both of these are disfavored for reasons already given).

Thanks


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk