为什么boost :: hash_combine中的幻数以十六进制指定

时间:2014-11-02 23:36:46

标签: c++ boost hash

在这种情况下的幻数是0x9e3779b9,在10的基数是2654435769.这个代码是否有任何理由

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 

使用十六进制表示而不是基数10表示?如果在代码中用2654435769代替0x9e3779b9,那么功能是否会保持相同?

1 个答案:

答案 0 :(得分:5)

文字是文字,同一文字的不同表示......字面上相同。

但是,表达式(文字与否)也有 类型

等效文字应为2654435769u(注意类型后缀使其成为unsigned)。

看看这个简单的测试 Live On Coliru

  • 0x9e3779b9的类型为unsigned int(32位)和
  • 2654435769的类型为long(64位)
  • 2654435769u再次输入unsigned int(32位)

正如你所看到的,十六进制表示有利于无符号,十进制表示有利于签名,使类型更大¹。


¹本机整数大小是实现定义的

(除了类型之外,有人可能会说,或许,在十六进制,八进制或最终二进制表示中,位分布可能会更明显)