这种方法不适合在 std::unordered_map 中使用 2D 坐标作为键吗?

Is this method bad for using 2D coordinates as keys in std::unordered_map?

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

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

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

并使用 coordinate_id 作为地图的 "hash"? 或者我应该使用专用的哈希函数来计算密钥? 如果我没有遗漏任何东西,上面提供的方法将不会导致任何冲突。

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

这里的问题是你的散列并不比整数的身份函数好。对点坐标的更改将导致 easily predictable 对哈希的更改。如果点坐标遵循某种规律,很容易意外地运行将该规律与桶选择算法相关联。
想象一下,如果 unordered_map 创建了 100 个桶并根据哈希的最后两位数字将项目放入桶中。并且你的点的 y 坐标可以被 100 整除。你所有的点都将进入同一个桶,破坏散列的目的 table!