新闻中心
c++中如何自定义哈希函数(hash)_c++哈希算法与unordered容器扩展
在C++中使用自定义类型作为unordered容器的键时,需提供哈希函数。1. 可特化std::hash模板,使Point等自定义类型直接兼容unordered_set/map;2. 或定义独立哈希函数对象(如PointHash)并在容器模板参数中指定;3. 为减少冲突,推荐用hash_combine技巧组合多字段哈希值,提升分布均匀性;4. 注意保持哈希一致性:相等对象必须产生相同哈希值,函数应为const且无副作用,避免未定义行为。正确实现后可高效利用哈希容器。

在C++中,unordered容器(如 std::unordered_map、std::unordered_set)依赖哈希函数将键映射到哈希桶中。标准库为常见类型(如 int、string)提供了默认的哈希实现,但当你使用自定义类型作为键时,就需要提供自己的哈希函数。
1. 通过特化 std::hash 来支持自定义类型
最常见的方式是为你的类型特化 std::hash 模板。这样可以让 unordered_map 和 unordered_set 直接使用。
struct Point {
int x, y;
bool operator==(const Point& other) const {
return x == other.x && y == other.y;
}
};
namespace std {
template<>
struct hash<Point> {
size_t operator()(const Point& p) const {
// 使用异或和质数扰动减少冲突
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
}
};
}
现在你可以直接使用 Point 作为 unordered_set 或 unordered_map 的键:
std::unordered_set<Point> points;
points.insert({1, 2});
points.insert({3, 4});
2. 自定义哈希函数对象并传入容器
如果你不想或不能修改 std::hash(比如不能向 std 命名空间添加特化),可以定义一个独立的函数对象,并在声明容器时指定它。
struct PointHash {
size_t operator()(const Point& p) const {
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
}
};
// 使用时指定哈希函数类型
std::unordered_set<Point, PointHash> points;
如果还涉及相等性判断,也可以一并传入自定义的比较函数:
struct PointEqual {
bool operator()(const Point& a, const Point& b) const {
return a.x == b.x && a.y == b.y;
}
};
std::unordered_set<Point, PointHash, PointEqual> points;
3. 组合多个字段的哈希值技巧
当结构体有多个成员时,简单异或可能导致冲突(如 x=1,y=2 和 x=2,y=1 哈希相同)。推荐使用更稳健的方法组合哈希值。
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
一种常用方法是模仿 boost::hash_combine:
template <class T>
void hash_combine(size_t& seed, const T& v) {
seed ^= std::hash<T>{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
struct PointHash {
size_t operator()(const Point& p) const {
size_t seed = 0;
hash_combine(seed, p.x);
hash_combine(seed, p.y);
return seed;
}
};
这种方法能有效降低哈希碰撞概率。
4. 注意事项与最佳实践
编写自定义哈希函数时要注意以下几点:
- 确保
相等的对象具有相同的哈希值(即满足 a == b则hash(a) == hash(b)) - 尽量让不同对象的哈希值分布均匀,减少碰撞
- 哈希函数应为
const且无副作用 - 避免使用未定义行为的操作,如对指针取哈希时注意有效性
- 对于复杂类型(如 vector、pair),可递归组合其元素的哈希值
基本上就这些。掌握自定义哈希函数后,你就能灵活地将任意类型用于 unordered 容器中,充分发挥哈希表的高效查找优势。
以上就是c++++中如何自定义哈希函数(hash)_c++哈希算法与unordered容器扩展的详细内容,更多请关注其它相关文章!
# 自己的
# 网站优化咨询n火27星
# 宁波网站建设排行
# 益阳关键词排名报价
# 海拉seo
# 红薯营销推广在哪做
# 雅安SEO鱼刺系统
# 西乡网站推广价格
# 高校开学网站推广文案
# 如东网站优化靠谱吗
# 企业seo优化网站
# 如果你
# 边缘
# ai
# 多字
# 并在
# 多个
# 游戏开发
# 递归
# 特化
# 自定义
# red
# 标准库
# 质数
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在Runstone环境中高效处理TasteDive API的JSON数据
漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
Bing引擎入口最新2025 Bing搜索免费官方登录
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
响应式图片在网页设计中的正确实现方法
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
微博网页版主页入口 微博官方网站免登录访问
Kafka Streams中基于消息头条件过滤消息的实现指南
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
外媒分析《GTA6》定价:卖100美元可以但真没必要!
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
德邦快递查询平台 德邦快递物流信息查询入口
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
Win11怎么关闭快速启动_Win11彻底关机设置教程
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
Tabulator表格日期时间排序问题及自定义解决方案
如何将HTML表格多行数据保存到Google Sheet
必由学官网首页入口 必由学教师网页版登录指南
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
J*aScript:在map操作中高效处理空数组
如何更改在 Excel 中打开超链接时的默认浏览器
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
J*a应用集成GitHub CLI与API认证指南
HTML长属性值处理:表单action路径优化与代码规范应对
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
小米汽车11月交付量突破40000台!雷军:将继续努力
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
Django表单验证失败时保留用户输入数据的最佳实践
Python getattr() 异常处理深度解析:避免程序意外退出
Win11怎么开启高性能模式_Windows 11电源计划优化设置
J*aScript中向JSON对象添加新属性的正确姿势
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
微信网页版官方入口教程 微信网页版网页版快速登录步骤
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
新三国志曹操传110级星符试炼夏侯渊极难攻略
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
J*a编写用户注册与登录功能_掌握字符串与验证逻辑


2025-11-15
浏览次数:次
返回列表
相等的对象具有相同的哈希值(即满足