当前位置: 首页 > ai >正文

24、std::hash

std::hash 是 C++ 标准库中的一个模板类,用于计算对象的哈希值。
它通常用于哈希表(如 std::unordered_mapstd::unordered_set)中,以便快速查找和存储数据。
下面是 std::hash 的用法和一些示例。

用法

std::hash 是一个模板类,定义在 <functional> 头文件中。
它为许多基本类型(如 intfloatstd::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> 可能只是返回输入值本身。

解释

  1. 哈希函数的作用

    • 哈希函数的主要作用是将输入数据映射到一个固定大小的哈希值。对于整数类型,某些标准库实现可能会直接返回输入值作为哈希值,因为整数本身已经是一个固定大小的值。
  2. 标准库实现

    • 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

解释

  1. 哈希整数和字符串

    • std::hash<int>{}(value):创建一个 std::hash<int> 对象,并调用其 operator() 计算整数 value 的哈希值。
    • std::hash<std::string>{}(value):创建一个 std::hash<std::string> 对象,并调用其 operator() 计算字符串 value 的哈希值。
  2. 自定义类型的哈希

    • 为自定义类型 Person 定义一个特化版本的 std::hash
    • operator() 中,使用 std::hash<std::string>std::hash<int> 计算 nameage 的哈希值,并将它们组合起来。

总结

std::hash 是一个方便的工具,用于计算对象的哈希值。它为许多基本类型提供了默认实现,对于自定义类型,可以通过特化 std::hash 模板来定义自己的哈希函数。

http://www.xdnf.cn/news/12563.html

相关文章:

  • conda环境配置(一) —— 常用虚拟环境操作命令
  • 新时代AI发展,更好的做自己
  • 第1讲、包管理和环境管理工具Conda 全面介绍
  • VB.net复制Ntag213卡写入UID
  • [C++] list双向链表使用方法
  • 深入理解 Java 多线程:原理剖析与实战指南
  • 乐观锁与悲观锁的实现和应用
  • 统一点云数据格式:高效转换与属性保留
  • 微服务架构的性能优化:链路追踪与可观测性建设
  • 基于Python学习《Head First设计模式》第六章 命令模式
  • PHP 表单 - 验证邮件和URL
  • Java+Access综合测评系统源码分享:含论文、开题报告、任务书全套资料
  • 物联网智慧医院建设方案(PPT)
  • JMeter-SSE响应数据自动化2.0
  • # STM32F103 SD卡读写程序
  • JDK21深度解密 Day 15:JDK21实战最佳实践总结
  • Go语言堆内存管理
  • 如何在 Java 中优雅地使用 Redisson 实现分布式锁
  • ArcPy扩展模块的使用
  • 深入解析HarmonyOS5 UIAbility组件:从核心架构到实战应用
  • Clickhouse统计指定表中各字段的空值、空字符串或零值比例
  • uniapp- UTS 插件鸿蒙端开发示例 虽然我们这个示例简单 但是这个是难住很多人的一大步
  • 交互标牌——视觉货币(数字)转换器项目及源码
  • 企业微信授权登录(uniapp项目)
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
  • 第4章:Cypher查询语言基础
  • GenSpark vs Manus实测对比:文献综述与学术PPT,哪家强?
  • 深度解析:Spring Boot 配置加载顺序、优先级与 bootstrap 上下文
  • 数据通信与计算机网络——数据与信号
  • 好未来0520上机考试题2:有效三角形的个数