gpt4 book ai didi

C++ : Writing a custom hash function for unordered_set that uses the number of buckets in the hash table

转载 作者:行者123 更新时间:2023-11-30 05:29:30 24 4
gpt4 key购买 nike

我正在为 Coord 类(二维坐标)编写自定义哈希函数。

是否可以更改以下哈希函数,使 b 为 unordered_set 哈希表中的当前桶数,并在桶数更改时更改?

namespace std
{
template <>
struct hash<Coord>
{
size_t operator()(const Coord &k) const
{
int b = 11;

int a1 = static_cast<int> (pow(b,(1.0/3.0)));
int a2 = static_cast<int> (pow(b,(2.0/3.0)));

return ((a1*k.getX() + a2*k.getY()) % b);
}
};
}

最佳答案

唯一可移植且高效的方法是计算尽可能均匀分布在 std::size_t 范围内的散列。对于给定的 key ,哈希函数在程序运行期间返回相同的哈希代码非常重要。

随着无序映射的增长,它会自行重新散列。由于键是不可变的,因此不可能将新的存储桶计数传递给键以计算新的哈希值(在任何情况下都将在映射中取模)。

更进一步:

试图将存储桶计数传递给键(例如,通过引用或可变数据成员)只会以失败告终,并且会出错。

一个问题是这会将这个键类耦合到 map 类 - 这已经够糟糕了,但是......

更糟糕的是,无序 map 不会与您通信以警告您它即将重新散列。您必须在插入项目后发现这一点。这意味着 map 中的所有项目现在都具有基于旧桶计数的哈希值。尝试向 map 中插入拷贝很可能会奏效,这会破坏 map 的语义!

要使其正常工作,在每次插入之后,您必须将所有项目移除到 vector 中,重新计算它们的哈希值,然后重新插入它们。

太可怕了!!!

请告诉我,我已经说服你不要走这条厄运之路。

关于C++ : Writing a custom hash function for unordered_set that uses the number of buckets in the hash table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36360137/

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