gpt4 book ai didi

c++ - 没有 union 的哈希码的内存地址

转载 作者:太空狗 更新时间:2023-10-29 20:24:58 24 4
gpt4 key购买 nike

在学习数据结构,特别是哈希表时,我们被告知为一种数据类型发明一个有效的哈希函数是一项非常艰巨的任务,但有人建议存在一个快速的捷径。也就是说,如果我们可以假设对象不会在内存中四处移动,并且我们可以将对象相等性定义为具有相同的内存地址(使用引用相等性而不是值相等性),那么我们可以像这样获得对象的哈希码:

#include<iostream>
template<typename T>
class hashcoder {
private:
union impl {
T* ptr;
int32_t hashcode; // or int64_t on a 64-bit architecture = architecture with 64-bit pointers
};
public:
static int32_t hash(const T& r) {
impl i;
i.ptr = &r;
return i.hashcode;
}
};

class myclass {
// whatever
};

int main() {
myclass m;
std::cout << hashcoder<myclass>::hash(m) << std::endl;
}

所以我的问题是:

  • 将内存地址用于哈希码是否有任何问题(再次假设引用相等是所需的行为)?
  • 鉴于使用 union 进行转换是 undefined behaviour ,我们如何将内存地址转换为整数?
  • (请随时指出我在上述代码中犯的任何其他错误。C++ 指针非常容易出错。)

最佳答案

  • 不,这没有错;散列是一个整数,保证每个对象都是唯一的,这降低了发生冲突的可能性。
  • 将指针转换为 uintptr_t。不需要 union 。此外,uintptr_t 具有适合平台的大小,因此您不再需要处理 int32_t 等。

    uintptr_t hash(const T &r)
    {
    return uintptr_t(&r);
    }

(如果哈希必须是 32 位,要么将其转换为 uint32_t,要么在 64 位平台上,使用 appropriate magic 将两半组合起来。)

关于c++ - 没有 union 的哈希码的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com