最近跟手機串接其中一支 API 的時候,小編在規格上設計了 request 必須帶一個 UUID 的值給 backend,以 Android 來說其實直接使用 UUID.randomUUID().toString() 就可以了,但 iOS 熱門的 FCUUID library 看起來好像給了一個錯誤的實作,而且大家好像常誤解了 UUID 的意思。為了這件事,昨天凌晨跟朋友弄了一個小時 Orz
---
一般大家常知道的 UUID 應該是像這樣 8909ea35-8b0e-4e1a-8ba3-9c0af47c77ca,由 8-4-4-4-12 及 16 進制的字元,共 36 個字元所組成的,Java 及一些 npm 的 library 也是如此實作。可是 iOS 的 FCUUID 卻是產生 8909ea358b0e4e1a8ba39c0af47c77ca,連續 32 個字元的字串
---
下面是對話內容,沒想到 UUID 的格式還有不一樣的 Orz
---
(I: ios, B: backend)
* I:你說的uuid有長度限制嗎?
* B:uuid 就是 36 chars
* I:format我不用管對吧,我只要送36個字元過去
* B:uuid 就 uuid
* I:你要well format的uuid,還是我給你一串36個字元的字串
* B:well format 的 uuid
* I:ok
* B:因為我就是講 uuid 啊 xddd
* I:這詞早就被亂用了
* B:怎說?
* I:很多人的uuid不是那個uuid阿,就一串unique的id,以前接過很多api,uuid就unique的id,他們就這樣叫,也沒人在管,uid??uuid??阿災,他們都這樣叫
* B:不夠嚴謹,這工程師不行吧
(半小時後)
* I:要不要dash呢?
* B:要,因為是 uuid
* I:我現在的uuid是用lib產生的
* B:昏
* I:uuidForSesion,這method聽起來是不是很完美,完全就是我們要的
* B:看起來是
* I:但他是32個char,沒4個dash
* B:心累 orz
---
雖然小編不會寫 Objective-C 但還是去 FCUUID 翻了一下程式碼 (https://github.com/fabiocaccamo/FCUUID/blob/master/FCUUID/FCUUID.m#L99),發現作者拿到 UUID 之後把 - 取代為空字串,所以只剩下 32 個字元。看了 README 的所有內容也沒提到會改變 UUID 的格式,「This library provides the simplest API to obtain universally unique identifiers with different levels of persistence.」
最後看到更有趣的一個 method (https://github.com/fabiocaccamo/FCUUID/blob/master/FCUUID/FCUUID.m#L358),uuidValueIsValid 會判斷所傳入的字串是否為 UUID 格式,結果不知道是不是為了相容於正確的 UUID 格式,裡面的 regex 寫成 ^[0-9a-f]{32}|[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$,讓小編啼笑皆非 囧
只不過在 GitHub 上都沒有討論到 32 個字元及 36 個字元的話題,不知道是不是使用 FCUUID 的 iOS 開發者都沒有這種需求呢?
#uuid #ios #fcuuid
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...