What is the default hash function used in C++ std::unordered_map?

前端 未结 2 715
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-30 23:48

I am using

unordered_map

and

unordered_map

What hash function is use

2条回答
  •  有刺的猬
    2020-12-01 00:28

    Though the hashing algorithms are compiler-dependent, I'll present it for GCC C++11. @Avidan Borisov astutely discovered that the GCC hashing algorithm used for strings is "MurmurHashUnaligned2," by Austin Appleby. I did some searching and found a mirrored copy of GCC on Github. Therefore:

    The GCC C++11 hashing functions used for unordered_map (a hash table template) and unordered_set (a hash set template) appear to be as follows.

    • Thanks to Avidan Borisov for his background research which on the question of what are the GCC C++11 hash functions used, stating that GCC uses an implementation of "MurmurHashUnaligned2", by Austin Appleby (http://murmurhash.googlepages.com/).
    • In the file "gcc/libstdc++-v3/libsupc++/hash_bytes.cc", here (https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/libsupc++/hash_bytes.cc), I found the implementations. Here's the one for the "32-bit size_t" return value, for example (pulled 11 Aug 2017)

    Code:

    // Implementation of Murmur hash for 32-bit size_t.
    size_t _Hash_bytes(const void* ptr, size_t len, size_t seed)
    {
      const size_t m = 0x5bd1e995;
      size_t hash = seed ^ len;
      const char* buf = static_cast(ptr);
    
      // Mix 4 bytes at a time into the hash.
      while (len >= 4)
      {
        size_t k = unaligned_load(buf);
        k *= m;
        k ^= k >> 24;
        k *= m;
        hash *= m;
        hash ^= k;
        buf += 4;
        len -= 4;
      }
    
      // Handle the last few bytes of the input array.
      switch (len)
      {
        case 3:
          hash ^= static_cast(buf[2]) << 16;
          [[gnu::fallthrough]];
        case 2:
          hash ^= static_cast(buf[1]) << 8;
          [[gnu::fallthrough]];
        case 1:
          hash ^= static_cast(buf[0]);
          hash *= m;
      };
    
      // Do a few final mixes of the hash.
      hash ^= hash >> 13;
      hash *= m;
      hash ^= hash >> 15;
      return hash;
    }
    

    For additional hashing functions, including djb2, and the 2 versions of the K&R hashing functions (one apparently terrible, one pretty good), see my other answer here: https://stackoverflow.com/a/45641002/4561887.

提交回复
热议问题