C++哈希函数,原始的 haser 即哈希<int xkey>是如何实现的

C++ hash function, how is the original haser i.e. hash<int xkey> implemented

本文关键字:哈希 何实现 实现 gt int haser 函数 原始 lt C++ xkey      更新时间:2023-10-16

我对哈希和STL世界都是新手,我看到了新的std::unrdered_set和SGI:hash_set,它们都使用了hasher哈希。我知道要获得一个好的负载因子,你可能需要编写自己的哈希函数,我已经能够编写一个了。

然而,我正试图深入了解原始默认has_functions是如何编写的。我的问题是:1) 原始默认HashFcn是如何编写的;更具体地说,散列是如何生成的?它是基于某种伪随机数吗。有人能给我指一些头文件吗(我有点不懂文档),我可以在那里查找;散列散列是如何实现的。

2) 它如何保证每次都能得到相同的钥匙?

请告诉我,我是否可以以任何方式让我的问题更清楚?

在我碰巧在这里安装的gcc版本中,所需的哈希函数在/usr/lib/gcc/i686-pc-cygwin/4.7.3/include/c++/bits/functional_hash.h

整数类型的哈希器是使用宏_Cxx_hashtable_define_trivial_hash定义的。正如您从名称中所期望的那样,这只是将输入值强制转换为size_t

gcc就是这样做的。如果你使用的是gcc,那么你应该在某个地方有一个类似名称的文件。如果您使用不同的编译器,那么源代码将在其他地方。并不是要求每个实现都对整数类型使用琐碎的散列,但我怀疑这是非常常见的。

它不是基于随机数生成器的,希望现在对您来说非常清楚这个函数是如何保证每次为相同的输入返回相同的密钥的!使用琐碎散列的原因是它尽可能快。如果它给你的数据提供了一个糟糕的分布(因为你的值往往以桶的数量为模发生冲突),那么你可以使用一个不同的、较慢的哈希函数或不同数量的桶(std::unordered_set不允许你指定确切的桶数量,但它允许你设置一个最小值)。由于库实现者对您的数据一无所知,我认为他们不会默认引入较慢的散列函数。

哈希函数必须是确定性的——即,相同的输入必须始终产生相同的结果。

一般来说,您希望哈希函数对任意输入以大约相等的概率产生所有输出(但尽管这是可取的,但这不是强制性的——对于任何给定的哈希函数,总会有任意数量的输入产生相同的输出)。

一般来说,您希望散列函数快速,并且(至少在某种程度上)依赖于整个输入。

一个常见的模式是:从一些半随机输入开始。将输入的一个字节与当前值组合。做一些可以移动位的事情(乘法、旋转等)对输入的所有字节重复。