0

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

但是,我正在尝试深入了解原始默认 has_functions 是如何编写的。我的问题是:1)原来默认的HashFcn是怎么写的;更具体地说,哈希是如何生成的?它是否基于一些伪随机数。谁能指点我一些头文件(我对文档有点迷茫),我可以在其中查找;哈希哈希是如何实现的。

2)如何保证每次都能拿到相同的key?

请让我知道我是否可以让我的问题更清楚?

4

2 回答 2

0

散列函数必须是确定性的——即相同的输入必须总是产生相同的结果。

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

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

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

于 2013-08-17T03:39:28.893 回答
0

在我碰巧在这里安装的 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不允许您指定确切的桶,但它确实让你设置一个最小值)。由于库实现者对您的数据一无所知,我认为他们不会默认引入较慢的哈希函数。

于 2013-08-17T10:29:05.597 回答