我需要将 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/