2013-08-17 54 views
0

我是新来的散列一般和STL世界,看到新的std::unrdered_set和SGI:hash_set,它们都使用hasher hash。我明白要获得一个很好的加载因子,你可能需要编写自己的散列函数,并且我可以编写一个散列函数。C++散列函数,原始haser如何实现散列<int xkey>实现

但是,我试图深入了解原始默认has_functions的写法。 我的问题是: 1)最初的默认HashFcn是如何写的;更具体地说,哈希如何生成? 它是基于一些伪随机数。任何人都可以指向我的头文件(我有点迷失在文档中),我可以在那里查找;哈希散列是如何实现的。

2)它如何保证每一次,你将能够获得相同的密钥?

请让我知道,如果我能以任何方式使我的问题更清晰?

回答

0

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

的整数类型的hashers使用宏_Cxx_hashtable_define_trivial_hash定义。正如你可能从名字中期望的那样,这只是将输入值转换为size_t

这是gcc如何做到的。如果你使用的是gcc,那么你应该有一个类似命名的文件。如果你使用的是不同的编译器,那么源代码将在其他地方。并不要求每个实现对整数类型使用简单的散列,但我怀疑它是非常普遍的。

它不是基于随机数发生器,并且希望现在很明显这个功能可以保证每次都能为相同的输入返回相同的密钥!使用一个简单的散列的原因是它的速度一样快。如果它给你的数据分布不好(因为你的值往往会模拟桶的数量),那么你可以使用一个不同的,较慢的哈希函数或不同数量的桶(std::unordered_set不允许指定确切的数字的桶,但它确实可以让你设置一个最低限度)。由于库实现者不知道关于你的数据的任何信息,我认为他们往往不会引入较慢的哈希函数作为默认值。

0

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

一般来说,你散列函数与生产大约相等的概率为任意的输入输出全部(但同时可取的,这是没有强制性的 - 对于任何给定的哈希函数,总是会有一个任意数量的输入产生相同的输出)。

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

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