当前位置: 首页 > 面试题库 >

boost :: hash_combine中的幻数

戎高爽
2023-03-14
问题内容

所述boost::hash_combine模板函数采用一个散列(称为参考seed)和对象v。根据文档,它结合seedvby
的哈希

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

我可以看到这是确定性的。我明白了为什么要使用异或。

我敢打赌,这种加法有助于将相似的值分开大范围地映射,因此探测哈希表不会崩溃,但是有人可以解释魔术常数是什么吗?


问题答案:

幻数应该是32个随机位,其中每个均等可能为0或1,并且位之间没有简单的相关性。查找此类字符串的常见方法是使用无理数的二进制扩展。在这种情况下,该数字是黄金分割率的倒数:

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

因此,“随机地”包含此数字会更改种子的每一位;如您所说,这意味着连续的值将相距很远。包括旧种子的移位版本在内,可以确保即使hash_value()值的范围很小,差异也将很快分散到所有位中。



 类似资料:
  • 根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以将boost::asio与一起使用。但是我找不到任何有关使用的信息,它具有更多的功能,例如。我怎么用?

  • Boost 库是一个经过千锤百炼、可移植、提供源代码的 C++ 库,作为标准库的后备,是 C++ 标准化进程的发动机之一。 Boost 库由 C++ 标准委员会库工作组成员发起,在 C++ 社区中影响甚大,其成员已近 2000 人。 Boost 库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。

  • 本文向大家介绍C ++中的第N个幻数,包括了C ++中的第N个幻数的使用技巧和注意事项,需要的朋友参考一下 如果数字可以被A或B整除,则该数字被称为幻数。我们必须找到第N个幻数。由于答案可能非常大,我们将以10 ^ 9 + 7取模。 因此,如果输入为N = 4,A = 4,B = 3,则输出将为8 为了解决这个问题,我们将遵循以下步骤- 定义一个函数,它将使用x,A,B, 返回(x / A)+(x

  • Listener是回调的活动引用。 问题就是这堂课: 当我在onCreate方法中收到包裹时:

  • 我正在尝试用Boost::ASIO实现NAT打孔。根据我的理解,NAT穿孔器的工作原理是这样的(UDP/TCP): 客户端A绑定到端口并连接到服务器S,客户端B执行相同操作。 当S同时接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A。 a和B接收对方的ip和端口,现在它们从同一端口向对方发送消息并形成连接(因为它们正在等待回复?) 如果没有成功的或,我似乎无法运行任何。当然,当目标端口没

  • 因为你正在读这本书,我希望你至少对Boost库有一点熟悉,或者你至少听说过Boost。 Boost里有很多库,只有很少一些是你不感兴趣的。可以肯定你会在里面找到马上就要用的库。Boost库覆盖了广泛的领域,从数学库到智能指针,从模板 元编程库到预处理器库,从线程到lambda表达式,等等。所有Boost库都具有宽松的许可证,确保库可以被自由使用于商用软件。支持通过新闻组实现, 那是Boost社区最

  • Boostnote 就如同名字一样,最主要的一个用途便是 Markdown 笔记编辑器。你所有的 Markdown 笔记拥有自动保存的功能,并且支持多种展示格式。拥有半实时的预览,所以你可以及时的检查最后的格式是否是和你所输入的一致。 而且还是一款专门为程序员朋友量身打造的笔记软件,除了日常笔记记录,最大的用处就是帮你记录无数的代码资源,你甚至可以以一个单个笔记为单位,在里面创建多个 Tab,以组