news 2026/4/16 1:16:56

负载因子才0.5,unordered_map就有30%的桶在碰撞——读libstdc++源码看懂Google为什么要造absl::flat_hash_map

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
负载因子才0.5,unordered_map就有30%的桶在碰撞——读libstdc++源码看懂Google为什么要造absl::flat_hash_map

std::unordered_map里插100万个随机整数,负载因子控制在0.5——每两个桶才分到一个元素。

听起来很宽裕。但如果你遍历每个桶,数一下有多少桶里挂了超过一个节点,你会得到一个不太直觉的数字:大约30%的桶已经在拉链了。

不是负载因子0.9,不是0.8,是0.5。桶的数量是元素的两倍,平均下来每个桶不到一个元素,但将近三分之一的桶里有两个或两个以上的节点排队等候。每多一个节点,就多一次指针跳转,多一次cache miss。

这个数字不是bug,是数学。跟哈希函数好不好没关系。任何足够均匀的哈希函数在这个负载因子下都会产生这个碰撞比例,因为元素到桶的分配本质上是一个独立随机过程,碰撞概率由Poisson分布精确描述。

Google内部的工程师做了同样的算术,但他们多算了一步:不仅算了碰撞比例,还算了每次碰撞在现代CPU上的真实代价。结论是,std::unordered_map的拉链法设计,在Google的服务规模下,仅哈希表这一个数据结构就贡献了可观的CPU cache miss。于是他们造了absl::flat_hash_map——一个用open addressing替代拉链法、用flat layout替代node-based存储、用SIMD指令并行探测元数据的哈希表。2017年CppCon上,Google工程师Matt Kulukundis在演讲Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step中首次公开了这套设计,后来被称为Swiss Table。

这篇从libstdc++的_H

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 1:16:11

【教育部-工信部联合验证】:2026奇点大会认证的3个多模态教育OS底层协议,2025Q4起将成为智慧教育装备强制接入标准

第一章:2026奇点智能技术大会:多模态教育应用 2026奇点智能技术大会(https://ml-summit.org) 多模态教育引擎的核心架构 本届大会首次发布开源教育大模型框架 EduMultimodal-1.0,支持文本、手写笔迹、语音指令、课堂视频流及AR交互数据的联…

作者头像 李华
网站建设 2026/4/16 1:15:27

Fluent视角设置:从手动拖拽到精准复现的工程实践

1. 为什么视角设置对工程仿真如此重要? 我第一次接触Fluent做流体仿真时,花了整整三天时间调整模型视角。当时觉得只要能看到流场就行,直到导师指着我的报告说:"这两个方案的对比图视角差了15度,涡流位置根本没法…

作者头像 李华
网站建设 2026/4/16 1:14:34

利用Xmodem协议在Uboot环境下实现串口程序烧录的实战指南

1. 为什么需要Xmodem协议烧录? 最近在调试一块嵌入式开发板时,遇到了一个典型问题:开发板虽然设计了网络接口,但在Uboot阶段网络功能极不稳定,经常出现连接失败。更麻烦的是,这块板子除了串口之外没有其他可…

作者头像 李华
网站建设 2026/4/16 1:13:39

NLP学习笔记03:文本分类——从 TF-IDF 到 BERT

NLP学习笔记03:文本分类——从 TF-IDF 到 BERT 作者:Ye Shun 日期:2026-04-15 一、前言 文本分类(Text Classification)是自然语言处理(NLP)中最基础、也最常见的任务之一。它的目标&#xff0c…

作者头像 李华