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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
V
Visual Studio Blog
博客园 - 叶小钗
H
Help Net Security
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Fortinet All Blogs
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
D
DataBreaches.Net
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence

Tony Bai

Rust重写运动,到底是真香还是被吹爆? 刚刚,DeepSeek开源Harness:把Agent拆成插件,一切皆可换 Google官方下场安利:AI时代,Go才是“最适合”的编程语言 从 Mozilla 孤儿到独立王国:起底 Rust 基金会如何“养大”一门产业级语言 扎克伯格罕见发万字长文:超级智能不能被少数人垄断,必须属于每一个人 3600人、95%覆盖率、24万次拦截:Cloudflare怎么用AI把“提效不降质”变成现实 1.5万星背后:Google首次揭秘Agent Skills是怎么“造”出来的 Go 核心团队公开新提案流程设计:加权投票、多轨评审,能拯救积压的近千个提案吗? Go 密码学前掌门人亲自提案:crypto/passkey 要把“免密登录”这件事一次性做对 Rust官方发文:AI 可以审代码,但不能写代码 AI智能体的记忆,终于有人认真研究“文件系统”这条路了——新论文给出五个反直觉答案 三年磨一剑!Go 桌面框架 Wails 发布 v3公测版:多窗口、AST 绑定、透明构建系统一次到位 Go 正在背离初心?一条 Reddit 热帖,暴露了 Go 社区最深的分歧:简单,到底能坚持多久? ccsa:给 Claude Code 的 session 起个人类可记的名字,一键 resume 谷歌重磅论文:多智能体不是万能药!260组实验实测出AI 智能体的第一条“缩放定律” YC亲自下场开源内部Harness:QM,一个“多人在线”的公司级Agent操作系统 前谷歌工程师万字拆解:AI替你写代码的时代,你更需要写好一份设计文档 隐退三年后杀回来:HashiCorp创始人官宣二次创业,这次要做「万物的多路复用器」 Thoughtworks最新报告:代码生成不再是瓶颈,“没人能验证”才是! 刚刚,MCP协议迎来“史上最大更新”:State彻底消失,Claude率先适配支持 Go 1.28 大动作:泛型集合终于要进标准库了,Set、树形Map、堆一次性标准化 上次说“没有靠谱的尺子”,这次 Dex Horthy 找到了一把——Opus 5 实测通过率只有 24% AI 写了 75% 的代码,工程师却越来越慌:“黑灯软件工厂”的问题不在 harness,而在模型本身 不用 Python,也能训练大模型:两年之后再看 Go 语言机器学习框架 GoMLX 百万行代码,两周搞定!Anthropic揭秘AI代码迁移六步法:秘诀不是改代码,是改流程 重磅!Tokio官方发布全栈框架Topcoat:不用WASM,AI时代Rust也能“糊”网页了 软件工厂的明与暗:当代码可以自动生产,人类为何必须留下一盏灯? Twitter之父再出手:Block开源Buzz,要让人类和AI Agent「同工同权」 Go 密码学维护者放大招:把 Passkey 存成一行字符串,还顺手为 Go 1.28 写好了 API Loop Engineering才火两个月,硅谷已经卷出“Graph Engineering”了
浏览器里的“安全阴谋”:为什么 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期]