C++哈希函数,原始的 haser 即哈希<int xkey>是如何实现的
C++ hash function, how is the original haser i.e. hash<int xkey> implemented
我对哈希和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
不允许你指定确切的桶数量,但它允许你设置一个最小值)。由于库实现者对您的数据一无所知,我认为他们不会默认引入较慢的散列函数。
哈希函数必须是确定性的——即,相同的输入必须始终产生相同的结果。
一般来说,您希望哈希函数对任意输入以大约相等的概率产生所有输出(但尽管这是可取的,但这不是强制性的——对于任何给定的哈希函数,总会有任意数量的输入产生相同的输出)。
一般来说,您希望散列函数快速,并且(至少在某种程度上)依赖于整个输入。
一个常见的模式是:从一些半随机输入开始。将输入的一个字节与当前值组合。做一些可以移动位的事情(乘法、旋转等)对输入的所有字节重复。
- 如何为位集找到/实现一个好的哈希函数
- C++哈希表中,两个相同的实现,但一个给出错误
- 哈希映射如何在 c++ 中实现?
- 使用哈希表设置实现
- 为自定义类C++实现哈希
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 如何在这个哈希映射中实现 AVL 树
- 如何为模板类实现std ::哈希
- 在哪里实现哈希函数
- 实现将字符串映射到 C++ 中的数组的哈希表。我一直在"Debug Assertion Failed",我不知道为什么
- 如果我们使用链表数组来实现哈希表,则可以以不需要遍历的方式实现"add"。这是真的还是假的?
- 使用链哈希实现动态哈希表
- 多索引哈希表实现
- 哈希表实现大小调整功能
- 为什么python的字典是作为哈希表实现的,而std::map是基于树的?
- 为什么c++标准库不包含哈希表实现
- 如何使用模板类的模板类子类从哈希表实现哈希集
- 哈希表实现,集合的零冲突?发人深思的东西