当前位置: 首页 > 知识库问答 >
问题:

ThreadL中的0x61C88647常量是什么意思ocal.java

贺刚毅
2023-03-14

我最近读了一篇关于方程组的复杂黑客的文章,冒烟的枪是一个常数,也出现在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;

共有2个答案

刁远
2023-03-14

0x61c88647=1640531527≈ 2 ^ 32 * (1 - 1 / φ), φ = (√5 1)÷2,这是另一个32位的黄金比率数值。

潘辰龙
2023-03-14

TLDR:这基本上是Fibbonachi哈希的一个例子。

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

现在,这是如何适应线程本地?当你创建一个新的线程本地时,它会根据以前的id(我们的神奇数字)分配一个ID。它被放入ThreadLocalMap中。发生冲突时,ThreadLocalMap会将该值放入下一个可用空间。我们的魔法值允许在此哈希中的值进行最佳“分散”,以避免这种情况。

 类似资料:
  • 问题内容: : 程序元素类型。此枚举类型的常量为Java程序中声明的元素提供了简单的分类。这些常量与meta- annotation类型一起使用,以指定在何处使用注释类型是合法的。 有以下常量: ANNOTATION_TYPE- 注释类型声明 构造 函数-构造函数声明 FIELD- 字段声明(包括枚举常量) LOCAL_VARIABLE- 局部变量声明 方法 -方法声明 包装 -包裹声明 参数 -

  • 问题内容: 我试图在Python 3.3中使用旧的库(可追溯至2003年!)。当我导入它时,Python抛出错误,因为源文件中有符号,例如: 我猜这是该语言现在被放弃的标志。 它到底是什么意思,我应该用哪个(较新的)符号代替? 问题答案: 这意味着不等于。它取自(python的前身)此处: 订单测试(表示 “不等于” ) 我相信它是从Pascal那里获得的,Pascal是Guido开始使用的语言。

  • 问题内容: 我发现此代码可在此处找到SO中的重复项。但我不明白这条线是什么意思 问题答案: 该运算符是Java中无符号的右移位运算符。它有效地将操作数除以右操作数的幂,或者仅在此处。 和之间的差异仅在移动负数时才会显示。如果运算符是a ,则运算符会将其移位到最高有效位,而无论如何都将移位。 更新: 让我们求平均值和()。我们可以轻松地进行数学运算: 现在,通过代码,涉及到以下这些位: 让我们将“转

  • 连字符库似乎是在应用程序中使用连字符的一种非常流行和免费的方式。 断字向量是什么意思? 我正在运行库源代码附带的示例。输出示例: 矢量中的奇数表示连字点。但所有这些价值观意味着什么?

  • 问题内容: 当我阅读有关雄辩的ORM主题部分的Laravel文档时,我有了一个新名词。 文档显示如何进行批量分配和或属性设置。但是在经历了这些之后,我对它及其工作方式没有一个清晰的了解。 根据我过去在CodeIgniter中的经验,我也没有听说过这个词。 有人对此有一个简单的解释吗? 问题答案: 质量分配是将数组发送到模型创建时,基本上是一次在模型上设置一堆字段,而不是一个接一个地设置,例如: (

  • 我想知道=_运算符在JavaScript中的含义。看起来像是在做作业。 示例: