我正在使用哈希表,我遇到了这个函数。但是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
}
};
答案 0 :(得分:9)
在大多数机器和ABIs上,指针通常是字对齐的。因此,除以sizeof
指针实质上忽略了最少的位(例如,大多数64位处理器上的3个最低位字节地址为0,因为64位字具有8个字节,每个位8位)。
答案 1 :(得分:2)
看起来它是散列指针的函数。指针指向通常对齐的对象。如果此处指向的对象分配有“new”,则最有可能与单词边界对齐。
因此,它可能总是可被8整除(或者如果是单词大小则为4)(当转换为数字时)并且函数将数字除以8以给出指针的真正重要性。