有没有办法将3D矢量表示为一个确定的数字?我的意思是两个具有不同值的向量不能具有相同的哈希值。我确定已经有一个问题,但遗憾的是我没有找到它。谢谢你的帮助。
编辑:
我知道这个2D矢量算法非常好(我认为):(x + y) * (x + y + 1) / 2 + y
答案 0 :(得分:1)
获取浮点向量的散列的最佳方法是将其转换为字节或字符的字符串并计算其上的散列。在下面的答案中使用numpy和python给出了一个例子: Most efficient property to hash for numpy array。
这对于大量向量有效,但由于将三个浮点数映射到整数这一简单事实,您无法保证不会发生冲突。但是,python hashlib库中有许多哈希算法可供选择,您可能需要进行实验。 C ++中的一个选项是Boost :: Hash。
答案 1 :(得分:1)
参见the pigeon-hole principle - 就像你不能适应的方式一样,你不能将100只鸽子分成10个洞,你不能将3个值唯一地转换成1个值(所有值都相同)。必须有重复。
现在,如果你的数字位数可以是矢量值的3倍,那么问题就变得相当容易了:
// convert x, y and z to the range 0-...
x -= minimum possible value
y -= minimum possible value
z -= minimum possible value
mult = maximum possible value + 1
hash = x * mult * mult + y * mult + z
如果您无法理解上述内容,请以值为0-99的范围为例。我们按x
多100*100 = 10000
,y
100
,因此哈希值为十进制值(最多)6位数x
, y
和z
彼此相邻,保证不重叠:
x = 12
y = 34
z = 56
hash = 123456
现在只需更改base / radix即可获得同样的最大价值。
如果某个基数没有任何重叠,x
,y
和z
的每个唯一值组合都会产生唯一的哈希值。
这是迄今为止最简单的方法,虽然它不会产生特别好的哈希值,因此它取决于您想要使用它的方式 - 可能有一种方法可以唯一地转换此数字到另一个很好的哈希值。