【问题标题】:Unpacking three values packed into a Long将三个值拆包成一个 Long
【发布时间】:2022-04-28 05:57:00
【问题描述】:

我有以下生成哈希的按位运算:

(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

我想我在这里遗漏了一些简单的东西,任何帮助表示赞赏。

  • 从具有 2^n 位的单个值,您为什么期望能够推断出具有 2^n 位的值?还是 x, y, z 比散列域小?
  • Z 将始终小于 4。并且 x 和 y 不会大于最大短值。
  • 哈希的域是什么?你在这里有一个 long ,但你需要至少 34 位来恢复两个 short 和一个 < 4 的值。
  • 是的,域名永远是 Long。 long 是 64 位吗?

标签: java kotlin bit-manipulation bitwise-operators


【解决方案1】:

您的“哈希”看起来不太像哈希。它看起来更像是将 3 个字段打包成一个长字段。

你可以得到xyz,它们产生相同的“哈希”,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2010-12-15
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多