这种方法在std :: unordered_map中使用2D坐标作为键是不是很糟糕?

时间:2017-04-01 09:18:41

标签: c++ hash hashmap unordered-map

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

这里的问题是你的哈希并不比整数的身份函数更好。对点坐标的更改将导致容易预测更改为哈希。如果点坐标遵循某些定律,则很容易意识到该法与铲斗选择算法之间存在相关性 想象一下,如果unordered_map创建了100个桶并根据散列的最后两位数将项放入桶中。并且你有y坐标的点可以被100整除。所有你的ponts将会转到同一个桶,打败哈希表的目的!