将4D矢量转换为长

时间:2017-03-24 22:05:45

标签: java vector hash minecraft minecraft-forge

我试图想出一种将4D矢量转换为有界长的方法。但是,矢量和结果长度有一定的限制。向量本身由4个整数组成:第一个整数可以是Java的能力范围内的任何东西(所以Integer.MIN_VALUE一直到Integer.MAX_VALUE)。第二个和第四个整数始终在-2999984和2999984之间(包括两者)。最后,第三个总是在0到255之间(同样,包括两者)。所以它遵循这种格式:

([Integer min - Integer max], [-2999984 - 2999984], [0 - 255], [-2999984 - 2999984])

该向量需要转换为-824629322721380016和824629339968358064之间的长。

我知道可能没有导致1对1匹配的功能,但我试图找出一个能够导致尽可能少的碰撞的功能。

如果您想知道,矢量和long的这些边界不是任意的。当我用Minecraft标记帖子时,我应该解释原因。我尝试将一个维度中的某个阻点与另一个维度中的阻挡匹配。 4D向量是[dimension id,x pos,y pos,z pos],得到的long是BlockPos的序列化形式(BlockPos#fromLong)。您可以看到this论坛帖子引发了我的询问。我在这里问,因为我的问题必然是MC特定的,因为它主要是数学和基于代码的。

2 个答案:

答案 0 :(得分:0)

我建议将4d向量转换为位,将该位表示为BigInteger,并使用为低冲突设计的散列算法对该整数进行散列。

您的数量'桶?实际上是长期的范围。

根据这个Murmur2似乎是最好的数字哈希: https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

你可以谷歌为Murmur2 java实现,但在撰写这个答案时,这里有一个这样的例子: https://github.com/sangupta/murmur

值得注意的是,如果你可以将维数限制为65536(16位) - 你可以单独使用1比1的哈希值。可能通过限制用户可以进入的虚拟世界的数量来实现这一目标吗?

答案 1 :(得分:0)

不幸的是,这无法做到。长只能容纳64位,但你的4D-Vector需要32 + 23 + 8 + 23> 64。

如果您可以稍微限制输入以使其适合,您可以将其转换为类似于以下代码(2D-int-Vector< - >长转换的示例):

System.out.printf("%.1f\n",arraySum(a));
System.out.printf("%.1f\n",arraySumBetter(a));