摘要: AgentStation 为了提升开发者体验,创建了 uuidkey
包,将 UUID 编码成美观易读的 API 密钥。该包支持 UUIDv7,并可解码密钥以便数据库排序和索引。
问题:
API 密钥是用户与 AgentStation 产品初次交互的重要环节。我们希望密钥既美观又易用,但行业中似乎缺乏统一标准。作为一家以开发者为中心的初创公司,我们投入时间和精力寻找理想的解决方案。
大多数 API 密钥都很糟糕:
我们对 API 密钥提出了以下要求:
- 安全
- 全局唯一
- 可排序
- 在 Postgres 中性能优异
- 外观美观
然而,大多数 API 密钥都缺乏美感,通常是格式不一致的随机字符,难以阅读、排序和识别。 我们希望 API 密钥也具备美感,如同生活中美好的事物一样对称。
我们拒绝的 ID:
过于随机、容易猜测、外观难看……都不尽如人意。
- 整数和 BigInt: 简单易读,易于排序。但它们会暴露密钥数量,且容易猜测,安全性不足。
- NanoIDs: 提供完全随机、可自定义的 ID,特别适合面向公众的标识符。但缺乏用于排序和调试的时间戳信息。
-
UUIDs: 行业标准,有两个版本值得考虑:
- UUIDv4:纯随机字符,简单有效。
- UUIDv7:包含时间戳,便于调试和数据库查询排序。
- ULIDs: 包含时间戳并使用 Base32 编码,提高可读性。但我们更倾向于 UUID 原生的 Postgres 支持,且其美观性仍不足。
我们的解决方案:
由于现有方案的美观性(对称性)不足,我们创建了自己的方法:
- 使用 UUIDv7 作为基础 ID,利用时间戳信息。
- 使用 Crockford Base32 编码提高可读性。
- 添加美观的破折号以增强视觉效果。
结果:
<code>key, _ := uuidkey.Encode("d1756360-5da0-40df-9926-a76abff5601d") fmt.Println(key) // Output: 38QARV0-1ET0G6Z-2CJD9VA-2ZZAR0X</code>
我们的密钥:
- 31 个字符(不含破折号为 28 个),比 UUID 的 36 个字符更短。
- 高度可读的段落,包含 4 组 7 个大写字母和数字,具有“块状”的美感和可读性。
- 以解码后的 UUID 形式存储时,可以按时间顺序排序。
- 用户可见的密钥中时间戳被模糊处理(但精通技术的使用者仍然可以解码)。我们认为密钥中的时间戳元数据是一个额外的好处,您也可以选择使用 UUIDv4!
为什么选择 UUIDv7?
除了时间戳的优势外,UUIDv7 将在 Postgres v18 中获得原生支持。虽然目前可以使用扩展在服务器端生成 UUIDv7,但原生 Postgres 支持的性能肯定会更好,并且可以很好地与 uuidkey.Encode()
配合使用。
在我们的实现中,我们目前在应用程序层生成密钥,并将其作为 UUID 存储以进行排序和索引。一旦发布 Postgres v18,我们将切换到 Postgres 生成,以减轻应用程序层的负载并获得更好的性能。
为什么选择 Crockford Base32?
我们选择 Crockford Base32 编码是因为它:
- 只使用大写字母和数字,提高了可读性。
- 将密钥长度减少约 1/5。
- 映射高效且可预测。
为什么使用破折号?
带破折号的密钥“块状”且对称。如果将各个字符灰显,它们看起来几乎像条形码。我们认为这使得快速读取密钥的一部分以识别它变得容易。
破折号确实会移除方便的双击复制功能,但我们认为这是为了可读性而值得的权衡。我们不希望用户到处复制粘贴它们,事实上我们希望它们得到谨慎处理。理想情况下,用户只在我们的仪表盘中生成密钥时复制一次密钥——因此我们在 UI 中添加了一个复制按钮来解决这个问题。
uuidkey 包:
我们在 github.com/agentstation/uuidkey 上开源了这些设计选择。如果您认同我们的美学、推理和对称性,并希望拥有自己美观的 API 密钥,欢迎试用我们的开源项目。
uuidkey
包的核心是通过 Base32-Crockford 编解码器将 UUID 编码为可读的密钥格式,并将其解码回 UUID。
编码:
代码片段已在原文中给出,此处不再赘述。
解码:
代码片段已在原文中给出,此处不再赘述。
该包旨在与遵循官方 UUID 规范 (RFC 4122) 的任何 UUID 配合使用,但我们专门测试并维护与两个最流行的 UUID Go 生成器的兼容性:
- Gofrs
安装很简单:
<code>key, _ := uuidkey.Encode("d1756360-5da0-40df-9926-a76abff5601d") fmt.Println(key) // Output: 38QARV0-1ET0G6Z-2CJD9VA-2ZZAR0X</code>
基本用法:
<code>go get github.com/agentstation/uuidkey</code>
我们努力将开销降至最低:
性能基准测试数据已在原文中给出,此处不再赘述。
贡献给 uuidkey:
我们致力于维护 uuidkey
作为可靠的开源工具,因为我们在生产中使用它——欢迎贡献!
如果您觉得它有用或有改进建议,我们很乐意在我们的 GitHub issues 或 Discord 社区中听到您的意见。
先前技术和巨人肩膀:
在我们发布项目后,我们发现了一些具有类似实现的项目,但仍然没有满足我们使用 Go 编码和解码 UUID 的标准。
- uuidapikey - Go,但不支持编码或解码 UUID 输入。
- based_uuid - Ruby,但用于公共 ID。
总结:
在 AgentStation,我们正在构建一个平台,让 AI 代理拥有自己的虚拟工作站来运行浏览器、参加会议和执行代码。随着我们扩展到数千个工作站,拥有可排序、高性能的密钥是实用的基础设施。
但我们也相信,开发者像我们一样欣赏对称的美好事物,即使是 API 密钥。
我们希望您发现 uuidkey
既实用又美观。
脚注已在原文中给出,此处不再赘述。
以上是制作漂亮的 API 密钥的详细内容。更多信息请关注PHP中文网其他相关文章!

掌握Go语言中的strings包可以提高文本处理能力和开发效率。1)使用Contains函数检查子字符串,2)用Index函数查找子字符串位置,3)Join函数高效拼接字符串切片,4)Replace函数替换子字符串。注意避免常见错误,如未检查空字符串和大字符串操作性能问题。

你应该关心Go语言中的strings包,因为它能简化字符串操作,使代码更清晰高效。1)使用strings.Join高效拼接字符串;2)用strings.Fields按空白符分割字符串;3)通过strings.Index和strings.LastIndex查找子串位置;4)用strings.ReplaceAll进行字符串替换;5)利用strings.Builder进行高效字符串拼接;6)始终验证输入以避免意外结果。

thestringspackageingoisesential forefficientstringManipulation.1)itoffersSimpleyetpoperfulfunctionsFortaskSlikeCheckingSslingSubstringsStringStringsStringsandStringsN.2)ithandhishiCodeDewell,withFunctionsLikestrings.fieldsfieldsfieldsfordsforeflikester.fieldsfordsforwhitespace-fieldsforwhitespace-separatedvalues.3)3)

WhendecidingbetweenGo'sbytespackageandstringspackage,usebytes.Bufferforbinarydataandstrings.Builderforstringoperations.1)Usebytes.Bufferforworkingwithbyteslices,binarydata,appendingdifferentdatatypes,andwritingtoio.Writer.2)Usestrings.Builderforstrin

Go的strings包提供了多种字符串操作功能。1)使用strings.Contains检查子字符串。2)用strings.Split将字符串分割成子字符串切片。3)通过strings.Join合并字符串。4)用strings.TrimSpace或strings.Trim去除字符串首尾的空白或指定字符。5)用strings.ReplaceAll替换所有指定子字符串。6)使用strings.HasPrefix或strings.HasSuffix检查字符串的前缀或后缀。

使用Go语言的strings包可以提升代码质量。1)使用strings.Join()优雅地连接字符串数组,避免性能开销。2)结合strings.Split()和strings.Contains()处理文本,注意大小写敏感问题。3)避免滥用strings.Replace(),考虑使用正则表达式进行大量替换。4)使用strings.Builder提高频繁拼接字符串的性能。

Go的bytes包提供了多种实用的函数来处理字节切片。1.bytes.Contains用于检查字节切片是否包含特定序列。2.bytes.Split用于将字节切片分割成smallerpieces。3.bytes.Join用于将多个字节切片连接成一个。4.bytes.TrimSpace用于去除字节切片的前后空白。5.bytes.Equal用于比较两个字节切片是否相等。6.bytes.Index用于查找子切片在largerslice中的起始索引。

theEncoding/binarypackageingoisesenebecapeitProvidesAstandArdArdArdArdArdArdArdArdAndWriteBinaryData,确保Cross-cross-platformCompatibilitiational and handhandlingdifferentendenness.itoffersfunctionslikeread,写下,写,dearte,readuvarint,andwriteuvarint,andWriteuvarIntforPreciseControloverBinary


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver Mac版
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能