【问题标题】:What is the meaning of 0x61C88647 constant in ThreadLocal.javaThreadLocal.java中0x61C88647常量是什么意思
【发布时间】:2016-08-17 10:38:28
【问题描述】:

我最近阅读了一篇关于 Equation Group's Sophisticated Hacking 的文章,并且确凿证据是一个常量,它也出现在 JDK 8 源代码中,例如ThreadLocal.java

HASH_INCREMENT 常量是什么意思,它是如何提高性能的?

/**
 * The difference between successively generated hash codes - turns
 * implicit sequential thread-local IDs into near-optimally spread
 * multiplicative hash values for power-of-two-sized tables.
 */
private static final int HASH_INCREMENT = 0x61c88647;

【问题讨论】:

  • 您的问题已在问题中包含的评论中得到解答。
  • @Kayaman 正如您在答案中看到的那样,背后还有更多内容。

标签: java optimization constants


【解决方案1】:

TLDR:基本上是Fibbonachi hashing 的一个例子。

如果您将 0x61c88647 转换为十进制,您将得到 1640531527,这是无意义的,直到您意识到在 32 位中,它是 2654435769 的签名版本。这个数字似乎有点奇怪,直到您意识到它是 2 32 ÷ φ 其中 φ 是黄金比例 (√5+1)÷2。

现在这如何适应 ThreadLocal?当您创建一个新的 ThreadLocal 时,它会根据之前的 id + 我们的幻数分配一个 ID。它被放入一个 ThreadLocalMap 中。如果发生冲突,ThreadLocalMap 会将值放入下一个可用空间。我们的魔法值允许此散列中的值的最佳“散布”以避免这种情况。

【讨论】:

  • 那句“直到你意识到”让我哭了。谢谢。
  • 散列算法的数学会对某人这样做。
【解决方案2】:

0x61c88647 = 1640531527 ≈ 2 ^ 32 * (1 - 1 / φ), φ = (√5 + 1) ÷ 2,又是一个32位的黄金比例Num。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    相关资源
    最近更新 更多