【问题标题】:Does the hash<char*> function in STL give 1-1 mapping between char* and size_t?STL 中的 hash<char*> 函数是否给出 char* 和 size_t 之间的 1-1 映射?
【发布时间】:2010-12-21 12:40:24
【问题描述】:

我有一双 我知道 pair.first 的值不能超过 1000。 我也知道字符串 pair.second 始终是 1 个单词。永远不要超过 1 个字。
因此,要为该对构造哈希值,我正在执行以下操作:

pair<int,string> p;
hash<char*> H;
hash_vale = H(p.second)*1000 + p.first;

我认为只要字符串的哈希值不太大并且 H(p.second) 将给出 1-1 映射,这将给出唯一值。这些假设是否有效?

谢谢,

【问题讨论】:

  • std::hash&lt;char*&gt; 不是特化的,所以它和std::hash&lt;void*&gt; 一样,因为它不检查字符串内容而只使用它的地址

标签: c++ stl hashmap


【解决方案1】:

根据定义,由于鸽巢原则,哈希不能是一对一的。即,有 2^32 个可能的哈希值,但可能的字符串要多得多。所以必须有两个哈希值相同的字符串。

其次,您几乎可以肯定将哈希值乘以 1000 会导致溢出,因为哈希应该使用所有 32 位。你最好散列 int 然后混合散列。 Boost有一个hash_combine函数:a + 0x9e3779b9 + (b > 2);

【讨论】:

  • 同意。那么,hash_map 类将在内部进行链接、管理冲突、在需要时进行重新散列以及所有这些以维持 O(1) 摊销时间?
  • 好吧,你真的应该使用 c++ unordered_map 如果它可用,但是是的,它会的。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 2013-04-10
  • 1970-01-01
  • 2010-11-30
  • 2021-09-17
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多