哈希图实现:---哈希码

HashMap implementation: --- hashcode

本文关键字:哈希码 实现 哈希图      更新时间:2023-10-16
template<class KEY, class VALUE>
unsigned int HashMap<KEY, VALUE>::hashCode(KEY key)
{
    unsigned int k = key & 0xffffffff; //error: no match for ‘operator&’ in ‘key & 4294967295u’
    k += ~(k<<9);
    k ^= (k>>14);
    k += (k<<4);
    k ^= (k>>10);
    return k;
};

如您所见,我正在尝试通过操作对象中的位来实现哈希代码。显然,位运算符不容易应用于用户定义的对象。

我想获取任何类型的对象的一些位,给定其内存位置,并根据需要操作这些位。然后,我将位重新解释为 int,并将按位运算符应用于 int。

这听起来是个好主意吗?以及如何从给定内存位置的任何类型的对象中获取位?

多谢!

不,这是一个糟糕的主意,因为它不尊重类型对平等的定义。可以定义一个类型,以便可以将几个不同的表示形式视为相等(想想一个std::string,它包含几个指针,没有其他任何东西。两个字符串可能相等(都包含 "hello world" ,但具有不同的指针,因为它们指向不同的内存块,因此您的哈希键实现将为两个相等的对象返回不同的哈希键。

换句话说,你会破坏哈希表,用户将无法找到他们放在表中的对象。

这不是

一个好主意。

如果不知道对象成员的详细信息,您就不知道哪些位实际上有用或与哈希相关。例如,由于对齐问题,实际数据成员之间可能存在内存间隙,并且这些间隙永远不会初始化,因此它们充满了垃圾数据。或者,如果数据成员是 char 数组字符串,则通过 null 终止符的所有字节都是垃圾,不应参与哈希。

有一些方法可以在C++中使用宏实现简单的反射,这些宏可以在这里做你真正想要的事情(即找到所有结构体的成员和类型(,但我不知道有什么好的开源的。我们的代码库中有一个工作(它有一个模板,它完全可以做你想要的,即为任意结构制作一个哈希函数(,但我无法共享它。

我想获取任何类型的对象的一些位,给定它的内存 位置,并按照我的意愿操纵位。

你在这里说的是你想将数据结构的基础位表示形式操作为一系列位。

这种方法仅适用于基元类型,例如整数、字符等。

在您的示例中,KEY可以是任何东西,并且底层位与结构的大小一样多,因此您的and操作并没有真正的帮助。

此外,KEY可以是一个派生类,并开始点击虚拟指针地址等,它们是底层结构的一部分。

无论如何,在我看来,代码(即使您决定走这条路并且SO中的一些朋友专家可以指导您(也太复杂了。

最好的方法是hash对象的每个成员。这至少是Java中遵循的方法,并且易于实现