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

111*_*001 4 c++ hash boost

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

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 
Run Code Online (Sandbox Code Playgroud)

使用十六进制表示而不是基数10表示?如果2654435769代替代码中的0x9e3779b9,功能是否仍然相同?

seh*_*ehe 6

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

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

等效的文字本来是2654435769u(注意制作它的类型后缀unsigned).

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

  • 0x9e3779b9有类型unsigned int(32位)和
  • 2654435769有类型long(64位)
  • 2654435769uunsigned int再次输入类型(32位)

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


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

(除了类型之外,人们可能会争辩说,或许,在十六进制,八进制或最终二进制表示中,位分布可能稍微明显一些)