C++11 中有哈希表,最新的 C++ 标准 - std::unordered_map, std::unordered_set。
编辑:
由于每种类型都有不同的分布,通常每种类型都有自己的哈希函数。这就是在 Java(从 Object 继承的 .hashCode() 方法)、C#、C++11 和许多其他实现中的实现方式。
编辑2:
典型的哈希函数做两件事:
1.) 以自然数创建对象表示。(这就是 Java 中的 .hashCode() 所做的)例如 - 字符串“CAT”可以转换为:
67 * 256^2 + 65 * 256^1 + 84 = 4407636
2.) 将此数字映射到数组中的位置。一种方法是:
integer_part(fractional_part(k*4407636)*m)
其中 k 是一个常数(Donald Knuth 在他的《编程艺术》一书中推荐 (sqrt(5)+1)/2),m 是哈希表的大小,fractional_part 和 integer_part (显然)计算实数的小数部分和整数部分.
在您的哈希表实现中,您需要处理冲突,尤其是当可能的键比哈希表的大小多得多时。
编辑3:
我阅读了有关该主题的更多内容,看起来 67 * 256^2 + 65 * 256^1 + 84 = 4407636 是执行 hash_code 的非常糟糕的方法。这是因为,“somethingAAAAAAABC”和“AAAAAABC”给出完全相同的哈希码。