惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
罗磊的独立博客
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
博客园 - 叶小钗
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
博客园 - 【当耐特】
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
量子位
宝玉的分享
宝玉的分享
V
Visual Studio Blog
博客园_首页
IT之家
IT之家
V
V2EX
腾讯CDC
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
I
InfoQ
有赞技术团队
有赞技术团队
J
Java Code Geeks
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Help Net Security

Tony Bai

告别标签页焦虑:我让 AI 帮我做了个浏览器插件 TabQueue Bun刚把Zig重写成Rust,这个团队却用487天反向重写 为了一个函数名,Go官方吵了两个月:maps.Same提案近日正式通过 Go 1.28 路线图首度曝光:Cgo 告别C工具链?泛型容器将入标准库? 掌控外环:为什么“循环工程”的边界必须由人类死守? 171个“已批准”却迟迟未实现的提案:Go语言的十年“欠账清单” 别再往 Go 里塞 Java 了:拆解 spf13 的 Idiomatic Go 信仰 AI 不在乎代码烂不烂,但你的Token账单在乎:一项660次实验揭示的编程新常识 10倍速 TypeScript 7.0 正式发布,前Go产品经理:Go才是AI智能体时代的“天选语言” Bun 重写为 Rust 后,Zig 之父罕见开炮:“我们早就等着看你重写” 全新 AI 技术栈:模型、Harness、Loop 与自我进化的智能体 AI 重写 Bun 为Rust全过程揭秘:101万行代码、11天、64个Claude并行开工 MCP Server 架构模式全解析:5 种模式、4 个反模式,与那条不能越过的“工具数量红线” 从手动 govanityurls + Nginx 迁移到 gvu:一次真实迁移记录 Go 私有模块拉取全解:凭据配置 + Vanity URL,个人与组织全覆盖 从“切歌小工具”到“零人工代码”:Claude Code 的诞生史,比科幻还科幻 如何使用 Claude Code 构建 AI 循环系统(Loops) 5 分钟上手 gvu:把 vanity import path 这件事,从“半天运维”变成一条命令 Go 对语言演化的保守态度,在未来 5 年是否仍然正确呢? 五年,三篇文章,一个我一直没真正解决的问题 别把“容易”当“简单”:Gin 框架作者撰文揭秘 88k Star 背后的架构哲学 每个 AI 工程师都应该知道的 20 个循环设计模式 cc-switch-cli:专为终端控与远程开发打造的 Claude Code 多模型切换工具! Andrej Karpathy 解析 Loop Engineering:构建“数日级”长程 Agent 的 9 条黄金法则 HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? 一个 Rust 项目吃掉 75GB 硬盘?聊聊 Go 与 Rust 的“缓存焦虑”与拯救指南 折腾过各种语言后,我为什么总是回到 Go 语言? YC 揭秘 AI 原生组织:打造一家在睡梦中自我进化的公司 从 WordPress 到 Hugo:一个 20 年技术博客的迁移实录 偿还十年技术债:深度拆解 Go 1.27 的 GODEBUG 强力清理计划 Go 1.27新特性前瞻:泛型方法落地,标准库内建 UUID - Tony Bai AI 正在撕裂研发团队:狂欢的“托管派”与心碎的“守夜人” - Tony Bai 屠榜 CNCF!为什么在云原生时代,Go 语言能把 Java、C++ 和 Rust 堵在门外? 上千程序员自爆 AI 的“卧槽时刻”:是推开神界大门,还是跌入黑盒地狱? - Tony Bai 大模型正在见顶!传奇架构师:欢迎来到“平坦曲线时代” - Tony Bai Anthropic 40万大样本揭秘:AI 时代为什么“专家”身价暴涨? - Tony Bai 在 AI 编码时代,为什么我们依然选择 Go 而不是 Rust? DeepMind 亮出王炸:别再手写 Agent Harness 了,AI 已经学会自己写了! 为什么说“编译通过,就能运行”?Google 专家 Alice 揭秘 Rust 的工程美学与底层逻辑 谷歌 SRE 重磅白皮书:当 AI 自动写出 10 倍代码,谁来阻止系统崩溃? 别再省 Token 了!硅谷新共识:浪费算力才是唯一捷径 - Tony Bai Linux 内核顶级维护者:写了 35 年 C,是 Rust 让我重新找回了编程的乐趣 拒领上亿、封杀 AI:Zig 之父为什么 10 年不发 1.0? 写地道的 Go 语言,是否能让你成为了一个更好的开发者? - Tony Bai RSA 将死?Let’s Encrypt 押注 MTCs 迎战后量子时代 C++ 的权力游戏:一部关于妥协、背叛与重生的“史诗神剧” - Tony Bai 终结十年纠结:Go 新提案允许 Example 支持任意函数签名 - Tony Bai 2026年,大厂重构核心系统为何集体投向 Go? - Tony Bai “辛辛苦苦考上985,却发现AI能替代我90%的工作”:今天的高考,我们还在为什么而战? - Tony Bai 传奇黑客 Geohot 炮轰 AI Agent:这是软件工程史上代价最昂贵的灾难! 别把 Go 写成 Java:毁掉项目从过度架构开始 - Tony Bai 开源维护者的困境 - Tony Bai AI 时代如何真正掌握一门新技术?这份非主流学习指南建议永久收藏 - Tony Bai Go 生态17年大浪淘沙:2026年最值得引入的10个“神仙级”QoL工具包 - Tony Bai 再见样板代码!Go 官方新提案:函数一键转接口 - Tony Bai 写代码快 10 倍,不等于研发快 10 倍!Google 揭秘 AI 系统级瓶颈 Google I/O 2026:Jeff Dean 携 DeepMind 众神宣告,AI Agent 正在终结“标准化软件”时代 AI 优化 1.5ms,手写 0.02ms!Ghostty 作者痛批 AI 编程“平庸陷阱” Redis 之父吐槽现代前端的复杂性:我们到底是在解决问题,还是在制造问题? - Tony Bai 无痛消灭技术债:Google I/O 2026 开启 Go 自动重构时代 省下 10% CPU!Uber 揭秘 Go 栈扩容的隐秘代价 从 Go 迁移到 Rust - Tony Bai 悄悄用 Go 重写 AI 基础设施:NVIDIA 的 GPU 云平台为何选择 Go? Shopify 23,000 名工程师背后的 Claude Code 配置方案(你可以直接复刻的完整配置) Google 开源 AX 与 Agent Substrate:构建以 Agent 为核心的云原生计算底座 十年难题终获突破:揭秘 Go 1.27 接口逃逸分析优化 - Tony Bai
浏览器里的“安全阴谋”:为什么 Go 1.27 的 UUIDv7 会离奇丧失随机性?
bigwhite · 2026-06-25 · via Tony Bai

本文永久链接 – https://tonybai.com/2026/06/25/go-1-27-uuid-newv7-always-generates-uuid-with-7000-on-browsers

大家好,我是Tony Bai。

在刚刚发布第一个候选版本(RC1)的 Go 1.27 中,一个让开发者感到贴心的特性升级,莫过于标准库终于原生内建了 uuid 包。我们终于可以告别第三方依赖,用最地道、最安全的方式在标准库里生成高并发、时间有序的 UUIDv7

然而,新包刚上新,一桩诡异的“灵异事件”就在 WebAssembly(WASM)和浏览器生态中传开了。

知名 Go 游戏引擎 Ebitengine 的创造者 hajimehoshi 在测试 Go 1.27rc1 时,提交了一个 Bug(Issue #80084):

当他在浏览器环境(GOOS=js GOARCH=wasm)下调用 Go 1.27 新标准库的 uuid.NewV7() 时,生成的 UUID 居然极度规律。在代表随机数和亚毫秒时间戳的第三组字符中,无论运行多少次,永远雷打不动地包含“7000”!

  • 019ee60f-29b3-7000-a12b-f817e25db8f4
  • 019ee610-29c7-7000-bc34-f04bc09150bb
  • 019ee610-2eb4-7000-884a-dfcad78e47d9

原本应该提供高强度碰撞防护的 12 位随机熵值,在浏览器里竟然离奇缩水、变成了死板的零(000)。

这究竟是 Go 标准库的设计失误,还是底层操作系统与浏览器之间展开的一场“安全阴谋”?在这篇文章中,我们一起来探索和解读一下。

破译密码学结构:什么是 UUIDv7 与 7000 幽灵?

要看懂这个 Bug,我们首先需要拆解一下 UUIDv7(RFC 9562 的底层二进制结构。

相比于我们常用的、纯随机的 UUIDv4,UUIDv7 最大的优势在于“时间有序性”。它将时间戳放在高位,使其能够像数据库自增主键一样对索引极度友好。

它的 128 位二进制排布如下:

  • unix_ts_ms (48位):自 Unix 纪元以来的毫秒级时间戳。
  • ver (4位):版本号。对于 UUIDv7,这里永远是二进制的 0111(即十六进制的 7)。
  • rand_a (12位):在标准的定义中,这 12 位可以用来存放亚毫秒级(微秒/纳秒)的高精度时间分数,或者用来充当单毫秒内的单调递增计数器。
  • rand_b (62位):纯粹的加密安全随机数。

在 Go 1.27 的标准实现中,为了提供极致的精确度和排序性,编译器采取了一种非常优雅的混合设计(RFC 9562 推荐的 Method 3):

它会获取系统的纳秒级高精度时间,把前 48 位(毫秒)放进 unix_ts_ms,把剩下的 12 位亚毫秒级高精度时间,直接塞进紧随其后的 rand_a 字段中。

因此,在正常的高精度系统上,第三组字符的第一个字母永远是代表版本的 7,而随后的三个十六进制字符则是随机变化的亚毫秒时间戳(如 7164、7008 等)。

但在浏览器(WASM)中运行这段 Go 代码时,由于系统的亚毫秒级高精度时间全部归零,rand_a 的 12 位数据彻底退化为了 000

它与版本号 7 拼在了一起,便诞生了那个雷打不动的“7000”幽灵。

浏览器的“防自卫反击”:Spectre、熔断与被阉割的时钟

为什么在浏览器里,Go 拿不到亚毫秒级的高精度时间?

这背后,其实是浏览器厂商为了对抗物理芯片漏洞,进行的一场长达数年的安全防御战争。

2018 年,现代处理器设计中最著名的硬件漏洞——Spectre(幽灵)和 Meltdown(熔断)爆发。这些漏洞利用了 CPU 的分支预测和缓存旁路分析,能让恶意网页读取到内存中受保护的敏感数据(包括其他网页的 Cookie、密码等)。

而此类高深、精密的侧信道攻击(Side-channel attacks),极度依赖于微秒级、乃至纳秒级的超高精度系统时钟。 攻击者需要通过精确测量 CPU 缓存读取的时间差,来推算内存中的数据。

为了彻底掐断攻击者的温床,各大浏览器巨头(Mozilla、Google、Apple)联手做出了一个残忍但必须的决定:在浏览器沙箱中,人工、强制地削弱并阉割所有 JavaScript 高精度时钟的精确度!

  • 浏览器里的 performance.now() 和 Date.now() 被强制进行了四舍五入。
  • 例如在 Firefox 中,默认情况下时钟精度被限制在 2ms。如果用户开启了防指纹追踪(Resist Fingerprinting)安全设置,精度甚至会被直接阉割到 100ms

当 Go 1.27 编译为 WASM 运行在浏览器中时,其底层的 time.Now() 最终只能去向浏览器的宿主环境(JavaScript)索要时间。

面对被浏览器安全策略阉割到毫秒甚至百毫秒级的残缺时钟,Go 编译器拼命想读取底层的纳秒数据,但读出来的永远只是冷酷的“0”。

隐藏的危机:丧失 12 位熵值的碰撞深渊

“虽然多出了 7000 看起来有点丑,但它依然是合规的 UUID,这有什么大不了的?”

如果你抱着这样的想法,那就低估了分布式系统设计的残酷性。

在单毫秒的极短时间内,如果我们并发生成了大量的 UUID(例如在 Cloudflare Workers 这样的边缘无服务器环境,或者高并发的 WASM 网页应用中):

  • 在正常系统上,我们有 12 位的 rand_a 亚毫秒高精度做保护,保证了单毫秒内极难发生碰撞;
  • 但在浏览器里,由于 rand_a 恒定为 000,我们瞬间丢失了 12 位的密码学熵(Entropy)!

这导致 UUIDv7 的实际随机保护带,从标准的 74 位直接缩水到了 62 位。在高并发、分布式生成场景下,这会导致碰撞(Collision)的概率呈指数级上升! 在金融交易、分布式主键或敏感会话管理中,这是完全不可接受的安全性崩溃。

Go团队的系统级解法

面对这个在开发阶段难以预料的“环境坑”,Go 团队的工程师 neild 与社区展开了积极的方案讨论和验证。

如何既不损害系统性能,又能完美补全这 12 位丢失的随机能量?

在最新的合并讨论中,Go 团队达成了一套极其务实的优雅解法(CL 792820):

  1. 不进行昂贵的硬件检测:有人提出通过在循环中调用 time.Now() 来动态测量当前系统的时钟精度。但这太重了,会极大地拖慢 NewV7() 的生成效率。
  2. 优雅降级与随机补全:当检测到当前系统的 wallclock 精度不足以填满 rand_a 的 12 位亚毫秒空间时(或者直接针对 GOOS=js 平台),Go 运行时会直接退回到备用方案——用真正的、通过 crypto/rand 产生的物理随机安全比特,去填满 rand_a 丢失的那 12 位空缺。
  3. 单毫秒内的单调递增(Monotonicity):在补全随机性的同时,如果系统在同一毫秒内产生了极高频的并发调用,AX 依然会使用 12 位作为计数器(Counter)进行累加,确保在高并发下的绝对单调递增和排序性。

通过这套巧妙的自适应补全设计,Go 1.27 不仅完美规避了浏览器的“安全阴谋”,更在系统最底层的设计上,为未来的 WebAssembly 和边缘计算(Edge Computing)开发者筑起了一道安全护城河。

小结

写好一段标准库级别的系统代码,从来都不是在真空中进行的。

Go 1.27 标准库 uuid 的这场“7000”幽灵风波,向我们揭示了现代高级软件工程最迷人的魅力:一个看起来再普通不过的基础库函数,其底层设计居然需要穿透编译器的类型系统、直接触碰到 CPU 硬件级安全漏洞(Spectre)以及浏览器的多沙箱防御边界。

大模型或许能帮你快速写出几行能运行的代码,但这种对多层系统级协作、硬件侧信道攻击以及跨环境兼容性的深度洞察和架构重塑,依然只能依靠人类最顶尖的系统级软件工匠去雕琢。

资料链接:https://github.com/golang/go/issues/80084


今日开放讨论:

你目前在项目中使用的是哪个版本的 UUID(v4、v5 还是 v7)?在面对诸如浏览器时钟阉割、硬件漏洞等不可控的系统运行环境变化时,你们的底层系统是如何进行防范和优雅降级的?

欢迎在评论区留下你最硬核的系统级见解,我们一起在评论区深度交流!


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

Related posts:

  1. 告别 google/uuid:Go 标准库拟新增 crypto/uuid 深度解析
  2. Go 1.27新特性前瞻:泛型方法落地,标准库内建 UUID
  3. Go 1.20中值得关注的几个变化
  4. Google I/O 2025 Go 语言进展:生产力、生产就绪与 AI 赋能
  5. 写Go代码时遇到的那些问题[第3期]