24、std::hash
std::hash
是 C++ 标准库中的一个模板类,用于计算对象的哈希值。
它通常用于哈希表(如 std::unordered_map
和 std::unordered_set
)中,以便快速查找和存储数据。
下面是 std::hash
的用法和一些示例。
用法
std::hash
是一个模板类,定义在 <functional>
头文件中。
它为许多基本类型(如 int
、float
、std::string
等)提供了特化版本。
可以通过实例化 std::hash
模板并调用其 operator()
来计算对象的哈希值。
示例
以下是一些使用 std::hash
的示例:
1. 哈希整数
#include <iostream>
#include <functional>int main() {int value = 42;std::size_t hash_value = std::hash<int>{}(value);std::cout << "Hash value of " << value << " is " << hash_value << std::endl;return 0;
}// Hash value of 42 is 42
这个代码的输出结果是 42
,这可能会让人感到困惑,因为通常我们期望哈希函数会生成一个看起来更随机的值。实际上,std::hash<int>
的实现是依赖于具体的标准库实现的。在某些实现中,std::hash<int>
可能只是返回输入值本身。
解释
-
哈希函数的作用:
- 哈希函数的主要作用是将输入数据映射到一个固定大小的哈希值。对于整数类型,某些标准库实现可能会直接返回输入值作为哈希值,因为整数本身已经是一个固定大小的值。
-
标准库实现:
std::hash<int>
的具体实现取决于标准库。在某些实现中,std::hash<int>
可能只是一个简单的恒等函数,即返回输入值本身。- 这种实现方式在某些情况下是合理的,因为整数本身已经是一个唯一标识符,不需要进一步处理。
示例代码
#include <iostream>
#include <functional>int main() {int value = 42;std::size_t hash_value = std::hash<int>{}(value);std::cout << "Hash value of " << value << " is " << hash_value << std::endl;return 0;
}
输出
Hash value of 42 is 42
总结
- 意义:虽然输出结果是
42
,但这并不意味着哈希函数没有意义。对于整数类型,直接返回输入值作为哈希值是一个有效的实现方式。 - 依赖实现:
std::hash<int>
的行为依赖于具体的标准库实现。在某些实现中,它可能会返回更复杂的哈希值,但在其他实现中,它可能只是返回输入值本身。
如果希望看到更复杂的哈希值,可以尝试对其他类型(如字符串)使用 std::hash
,或者查看标准库的具体实现。
2. 哈希字符串
#include <iostream>
#include <functional>
#include <string>int main() {std::string value = "hello";std::size_t hash_value = std::hash<std::string>{}(value);std::cout << "Hash value of \"" << value << "\" is " << hash_value << std::endl;return 0;
}// Hash value of "hello" is 2762169579135187400
3. 自定义类型的哈希
对于自定义类型,需要为其定义一个特化版本的 std::hash
。例如:
#include <iostream>
#include <functional>
#include <string>struct Person {std::string name; // 姓名int age; // 年龄// 重载等于运算符bool operator==(const Person& other) const {return name == other.name && age == other.age;}
};namespace std {template <>struct hash<Person> {std::size_t operator()(const Person& p) const {return std::hash<std::string>{}(p.name) ^ (std::hash<int>{}(p.age) << 1);}};
}int main() {Person p{"Alice", 30};std::size_t hash_value = std::hash<Person>{}(p);std::cout << "Hash value of Person is " << hash_value << std::endl;return 0;
}// Hash value of Person is 7617411810006367381
解释
-
哈希整数和字符串:
std::hash<int>{}(value)
:创建一个std::hash<int>
对象,并调用其operator()
计算整数value
的哈希值。std::hash<std::string>{}(value)
:创建一个std::hash<std::string>
对象,并调用其operator()
计算字符串value
的哈希值。
-
自定义类型的哈希:
- 为自定义类型
Person
定义一个特化版本的std::hash
。 - 在
operator()
中,使用std::hash<std::string>
和std::hash<int>
计算name
和age
的哈希值,并将它们组合起来。
- 为自定义类型
总结
std::hash
是一个方便的工具,用于计算对象的哈希值。它为许多基本类型提供了默认实现,对于自定义类型,可以通过特化 std::hash
模板来定义自己的哈希函数。