【发布时间】:2012-01-20 18:49:14
【问题描述】:
目前 Boost 具有 hash_combine 函数,可以输出 32 位无符号整数(准确地说是 size_t)。一些参考资料:
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/combine.html
Magic number in boost::hash_combine
我想探讨一下如何创建 64 位版本的 hash_combine。
首先要得到 64 位的黄金比例或任何其他无理数。
第二部分是使用班次。这部分相当棘手,我想问一下是否有使用轮班获取哈希值的最佳实践或指南?或者像原始代码一样选择班次:
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
完全随机?
还有如何评估hash_combine 的输出以确保它不会比原始哈希函数hash_value 产生更多的冲突?
【问题讨论】:
-
2^64/φ是
0x9E3779B97F4A7C15。 -
感谢 Kerrrek。找到价值不是问题。我感兴趣的是是否有任何规则或最佳实践来使用您在 boost::hash_combine 中看到的移位和添加。或者选择班次和加班是完全随机的。
-
我觉得你应该file a bug report。
-
嗨,Kenny,我在问一些概念,这些概念可以让我在理解它们之后进行写作。