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

标签 c++ hash unordered-set

我正在为 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/

相关文章:

C 内存管理 -> 哈希

c++ - unordered_set 中可能有两个键,它们被认为是相等的?

c++ - 为 uint8_t 数组分配内存

c++ - 如何使用Lz4库解压小于原始大小的文件?

c++ - 使用对象的哈希结构

用于树数据结构的无序集的 Python 单元测试

c++ - Qt 的 std::unordered_set 模拟/对应

c++ - 添加简单的 cout 后程序不会运行

c++ - C++中的类存储保证

创建具有快速插入、删除、成员资格测试和随机选择的数据结构