8

我正在使用哈希表,我遇到了这个函数。但是 hash / sizeof(void *) 是什么意思呢?以及之后给出的评论 - 摆脱已知的 0 位?

// This matches when the hashtable key is a pointer.
      template<class HashKey> class hash_munger<HashKey*> {
       public:
        static size_t MungedHash(size_t hash) {
          // TODO(csilvers): consider rotating instead:
          //    static const int shift = (sizeof(void *) == 4) ? 2 : 3;
          //    return (hash << (sizeof(hash) * 8) - shift)) | (hash >> shift);
          // This matters if we ever change sparse/dense_hash_* to compare
          // hashes before comparing actual values.  It's speedy on x86.
          return hash / sizeof(void*);   // get rid of known-0 bits
        }
      };
4

2 回答 2

9

在大多数机器和ABI上,指针通常是字对齐的。因此,除以sizeof指针本质上是忽略最低位(例如,在大多数 64 位处理器上,字节地址的 3 个最低位为 0,因为 64 位字有 8 个字节,每个 8 位)。

于 2013-10-24T13:59:42.357 回答
2

看起来它是一个散列指针的函数。指针指向通常对齐的对象。如果此处指向的对象分配有“新”,则它很可能与单词边界对齐。

因此,它可能总是可以被 8 整除(或者如果是字长,则为 4)(当转换为数字时),并且该函数将您的数字除以 8,以便为您提供指针真正重要的信息。

于 2013-10-24T14:05:56.530 回答