Math 三维矢量的哈希值

Math 三维矢量的哈希值,math,vector,hashcode,Math,Vector,Hashcode,有没有办法将3D矢量表示为一个确定的数字?我的意思是两个不同值的向量不能有相同的散列值。我肯定已经有一个关于这个的问题了,但不幸的是,我没有发现。谢谢你的帮助 编辑: 我知道2D向量的这种算法非常好(我认为):(x+y)*(x+y+1)/2+y获取浮点向量哈希值的最佳方法是将其转换为字节或字符字符串,并在其上计算哈希值。下面的答案中使用numpy和python给出了一个示例: . 这将有效地处理大量向量,但由于将三个浮点映射到一个整数这一简单事实,无法保证不会发生冲突。然而,python ha

有没有办法将3D矢量表示为一个确定的数字?我的意思是两个不同值的向量不能有相同的散列值。我肯定已经有一个关于这个的问题了,但不幸的是,我没有发现。谢谢你的帮助

编辑:


我知道2D向量的这种算法非常好(我认为):
(x+y)*(x+y+1)/2+y

获取浮点向量哈希值的最佳方法是将其转换为字节或字符字符串,并在其上计算哈希值。下面的答案中使用numpy和python给出了一个示例: .

这将有效地处理大量向量,但由于将三个浮点映射到一个整数这一简单事实,无法保证不会发生冲突。然而,python hashlib库中有许多哈希算法可供选择,您可能需要进行实验。C++中的一个选项是Boosi::hash。

参见——同样的方法,你不能将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为例。我们将通过
100*100=10000
x
乘以
100
,并通过
100
y
乘以
y
,因此哈希值将是一个十进制值(最多)6位,且
x
y
z
彼此相邻,保证不重叠:

x = 12
y = 34
z = 56
hash = 123456
现在,这个想法也适用于任何最大值,只要改变

如果某个基中没有任何重叠,则
x
y
z
值的每个唯一组合将产生唯一的哈希


这是迄今为止最简单的方法,尽管它不会产生特别好的散列,因此,这取决于你想用它做什么-可能有一种方法可以唯一地将这个数字转换成另一个数字,这将是一个好的散列。

为什么不在你进行切片时对切片的散列进行X射线切割三维向量呢?原则上,你要做的是使用可逆变换将三维实空间R^3映射到一维空间R上,这是不可能的。然而在实践中,用真正的编程语言来解决真正的问题可能是可以接受的,你能更具体一点吗?@Conor是的,这就是我需要的,它不一定是可逆的;我不知道如何更具体,告诉我你还需要知道什么^^问题是精度和空间,你的向量现在是如何表示的,你想如何表示你的散列值,你的散列函数必须有多快?我只是把x,y和z作为浮点数,并想把散列值计算成整数(最后)在最好的情况下通过一些简单的算术运算