c++ - 此方法不适合使用 2D 坐标作为 std::unordered_map 中的键吗?

标签 c++ hash hashmap unordered-map

我需要将 2D 坐标存储为 std::unordered_map 中的键。 我知道坐标的每个分量不会超过16位。

将坐标对 (x,y) 合并到像这样的 uint32_t 是不是不好的做法

uint32_t coordinate_id = (x << 16) | y;

并使用坐标 ID 作为 map 的“哈希”? 或者我应该使用专用的哈希函数来计算 key ? 如果我没有错过任何内容,上面提供的方法将不会导致任何冲突。

最佳答案

你的方法一定会奏效。如果组件可以超过 16 位,它甚至可以工作:允许哈希冲突。

这里的问题是你的哈希并不比整数的恒等函数更好。点坐标的更改将导致哈希值发生容易预测的更改。而如果点坐标遵循某种规律,则很容易意外地遇到该规律与桶选择算法之间的相关性。
想象一下,如果 unordered_map 创建了 100 个存储桶,并根据哈希值的最后两位数字将项目放入存储桶中。并且你的 y 坐标可以被 100 整除的点。你所有的点都将进入同一个桶,这违背了哈希表的目的!

关于c++ - 此方法不适合使用 2D 坐标作为 std::unordered_map 中的键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154990/

相关文章:

c++ - 从基类实例获取指向(纯)虚函数的指针

c++ - eclipse 中 c++ 的谷歌测试覆盖率?

asp.net - 用户登录网站时的 T-SQL AES 加密与哈希/加盐

c# - c#中的哈希字符串

sql - 在 SQL Server 中使用查询在 Base64 中哈希 MD5

java - 如何使我的 HashMap 按预期工作?

带有 ArrayList 通配符的 Java HashMap

c++ - 调用单例库

c++ - 如何使用 C++ 复制几个具有不同扩展名的文件

java - 使用 HashMap 比较两个不同类型的列表