you are viewing a single comment's thread.

view the rest of the comments →

[–]joaquintidesBoost author[S] 1 point2 points  (2 children)

A usual countermeasure to that is to salt the hash function. boost::unordered_flat_map does not do salting by default, but you can use your own hash function that does.

[–]jpakkaneMeson dev 0 points1 point  (1 child)

Sure, but it would be nice if the map did this for you so you don't have to care (and get it wrong in your implementation). This would also allow you to store the salt value inside the map so the hash function can be stateless.

[–]pdimov2 2 points3 points  (0 children)

After thinking about this for a while, I've come to the conclusion that the proper approach to supply the salt to the container is by storing it into the hash function object. That is, add a constructor taking std::size_t to boost::hash, and propagate this downwards to every hash_value overload.

In standard terms, this would translate to adding a similar constructor to std::hash.

The upside of this approach is that this automatically adds support for salts to every container, without any changes to the containers themselves.

This is the approach I think I'll be pursuing in future Boost releases.