将三个值解包到一个 Long 中

Unpacking three values packed into a Long

我有以下生成散列的按位运算:

(z shl 28) or (y shl 14) or x // (z << 28 | y << 14 | x) in java

我希望能够从上面计算的散列中推导出 x、y 和 z。我每次都能得到 Z 和 X,但我很难得到 Y - 它只是偶尔有效。

Z 永远小于 4。x 和 y 不会大于最大空值。

这就是我正在做的事情:

    val hash = 684297131L // sample hash
    val z = hash shr 28
    val y = hash shr 14 // this works only sometimes
    val x = hash and 0xfff

我想我在这里遗漏了一些简单的东西,感谢任何帮助。

您的“散列”看起来不太像散列。看起来更像是把3个字段打包成一个long。

您可以获得 xyz,它们会产生相同的“散列”,如下所示:

val z = hash shr 28
val y = (hash shr 14) and 0x3fff
val x = hash and 0x3fff

这可能正是您想要的。有不同的数字可以产生相同的哈希值,但这些是最简单的。