gpt4 book ai didi

c++ - 类和子类的通用散列函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:19 24 4
gpt4 key购买 nike

我正在编写一种类框架,我需要在其中获取对象的哈希值,以便将它们存储在哈希表中。
所以如果我有:

class A {
int a;
};

class B : public A {
const char* str;
};

class C : public A {
double d;
otherClass* oc;
};

我需要能够通过散列函数运行 BC 以获取对象的散列值。

我该怎么办?我考虑过简单地执行 sizeof(thing) 并对原始字节进行哈希处理,但这是一个好的方法吗?我还考虑过在基类中使用 virtual uint_32 hash() = 0,但是必须为每个子类实现它是次优的。

最佳答案

通常您需要您的散列函数与类中定义的相等性一致。也许相等是由重载的 operator== 定义的,但即使没有重载,您也可能认为两个对象应该被视为相等,并且如果它们的所有数据成员都相等,则它们具有相同的哈希码。

散列原始字节通常不起作用。不能保证数据成员都相等的两个对象将具有相等的字节。例如,出于对齐原因,对象中某处可能有一些填充,填充字节可以采用任何值。

更糟糕的是,无法保证两个相同的 double 值具有相同的字节数。例如,正/负零比较相等。

C 的情况特别棘手:如果两个 C 对象指向不同的 otherClass 对象,但是两个 otherClass 对象是相等的,那么这两个 C 对象应该有相同的哈希值?您不能完全笼统地定义它,它是 C 类的一个属性。

如果某些东西也是可能的最好的,它可以是“次优的”吗? ;-) 唯一通用的解决方案是定义一个函数hash,并为每个类编写一个版本。在您的情况下,您可以将其设为 A 的虚函数,但您也可以查看 std::hash 在 C++0x 中的工作方式:它实际上是一个模板仿函数类而不是函数,并且它可以专门用于用户定义的类。当然,这不提供动态多态性,但是如果您将它专门用于 A,并让实现调用您在每个类中实现的虚函数,那么您的散列函数将与 std::unordered_map

关于c++ - 类和子类的通用散列函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234148/

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