
Christian Mazakas wrote:
update() works properly for hashing byte streams (as it must) but because it's intended as part of an implementation, it's not exactly suitable for most end- users who just want to hash their 3 GB file.
It is, though. Here's the actual example: https://pdimov.github.io/hash2/doc/html/hash2.html#example_md5sum static void md5sum( std::FILE* f, char const* fn ) { boost::hash2::md5_128 hash; int const N = 4096; unsigned char buffer[ N ]; for( ;; ) { std::size_t n = std::fread( buffer, 1, N, f ); if( std::ferror( f ) ) { std::fprintf( stderr, "'%s': read error: %s\n", fn, std::strerror( errno ) ); return; } if( n == 0 ) break; hash.update( buffer, n ); } std::string digest = to_string( hash.result() ); std::printf( "%s *%s\n", digest.c_str(), fn ); } Note how the `update` call is perfectly intuitive and suitable for end use. If we try to replace this with a `span`, it's not going to become any better. Why is that? We know that `span` must result in better code? Well it is because std::fread doesn't return a `span`, as doesn't most of the rest of existing code in 2025. If everything used `span`, everyone else should also use it, but we aren't there yet. Nowadays you get a `size_t`, and the existing `update` will happily take it, without forcing you to construct an unnecessary `span` out of it.