摘要: 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 - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver Mac版
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能