[cfe-dev] RFC: change string hash function in libc++

Jan Engelhardt jengelh at medozas.de
Sat Dec 3 19:37:19 PST 2011


On Sunday 2011-12-04 02:17, Howard Hinnant wrote:

>I've put together the following test function which scores a container at any given time during its lifetime based on the number of collisions it has.  A score of 0.f indicates that all values are hashed into the same bucket.  A score of 100.f indicates that there are no collisions.
>
>//  A quantitative grade [0, 100] of how many collisions there
>//    are in an unordred_set/map.
>//    0 == all elements in the same bucket
>//  100 == no collisions
>//  A lower max_load_factor pushes this score towards 100
>//  A higher max_load_factor pushes this score towards 0
>template <class C>
>float
>grade(const C& c)
>{
>    using namespace std;
>    if (c.size() <= 1)
>        return 100;
>    float score = 0;
>    size_t bc = c.bucket_count();
>    for (size_t i = 0; i != bc; ++i)
>    {
>        size_t bs = c.bucket_size(i);
>        if (bs > 1)
>            score += bs - 1;
>    }
>    return 100*(1 - score / (c.size() - 1));
>}
>
>I'm not at this time proposing putting this code into libc++ nor even in the
>test suite. I'm simply requesting comments on if this is a reasonable tool for
>quantifying the goodness of an unordered container's state.

Yes, it matches [1]. hmap_agg_index was introduced Aug 19 2009 there.

[1] http://tinyurl.com/7xsz8jw
    long: http://libhx.git.sourceforge.net/git/gitweb.cgi?p=libhx/libhx;a=blob;f=src/tc-map.c;hb=HEAD#l340



More information about the cfe-dev mailing list