(此算法適用於我正在開發的iPhone應用程序,如果這有助於上下文的話)。如何智能地將任意元數據編碼到UUID中?
我們需要使UUID唯一標識某些產品。通常這與分配唯一號碼一樣簡單,但我們也希望將元數據編碼到我們的UUID中。我們的API只允許我們使用一個字段,因此我們希望將UUID字段用作唯一標識符和元數據載體。
通常情況下,您可以將數據與下劃線一起大雜燴,但是我們有一個要求使得難度更大:其中一個元數據項可以是n項的列表。
這裏是元數據:
- 設備類型(〜多達16種離散的類型)
- 閔OS版本支持的(XXX格式,其中x爲0-99之間的數字)
- 敏二進制(應用程序)版本支持(XXX格式,其中x是0-99之間的數字)
- 的任何產品,該產品取代版本(的ñ的ID列表,其格式是這樣的設計問題的一部分)
限制
我們唯一的技術限制是,我們只能使用多達128個字母數字字符(A-ZA-Z0-9),包括下劃線,句號和連字符,來表示UUID(這是一個API)。
使用案例
這裏有幾個用例來解釋一下這個算法將有助於解決:
用戶購買產品A和產品B後來我們推出的產品C,其是一個產品A + B包裝在一起。通過C的UUID,我們希望我們的應用程序代碼能夠確定C實際上是A + B,並且由於用戶已經擁有A + B,因此C不會出現在可用產品列表中。
用戶有2個設備A和B.設備B不支持產品C,因此當用戶在設備B上查看產品時,C不應該對設備B可用,但它應該在設備A上。
什麼我因此完成遠
設備類型應瞭解快速與16種離散類型,I可以位掩碼 - 16位= 4個十六進制字符。夠簡單。
版本控制是相同的 - 我可以將每個版本段(x.y.z)填充到2位數,然後只有2個6位數的運行版本信息。
不重要的是如何引用以前的產品ID。顯然,我的記憶空間有限 - 我只有128個字符(使用上述方法,我只剩下112個字符)。如果我需要ñ項目的列表,我將用完空間。
實際上n < = 5是合理的。任何給定的產品將取代不超過5個其他產品。
固定長度的UUID不是必需的。是的,一個「便宜」的解決方案是將ID列表與下劃線菊花鏈連接起來,但由於許多ID必須首先手動輸入,因此我們希望避免使用128個字節(如果可以的話)躲開它。在算法的正確性之後,最小化UUID長度應該是優先級。
另一部分可能會使這種困難 - 雖然這不是UUID本身,而是代碼中的實現 - 是如果其中一個被取代的產品取代了別的東西,則需要級聯。
任何指針我可以在這裏開始?
您可以使用1個十六進制字符對16種類型進行編碼。 – bdares 2011-04-05 07:01:13
@bdares,等等。我認爲你是對的,但後來我意識到我希望能夠說「這個產品支持這16個設備的任何SUBSET」,而不僅僅是16箇中的1個。在後一種情況下,你是對的。那麼,編碼「16的X」類型(其中X <= 16)所需的最小空間是多少? – makdad 2011-04-05 07:02:04
1個十六進制字符可以是0-9,A,B,C,D,E,F ...,它們是16.如果每個字符代表1種設備,則設備可以用1個十六進制標識其類型字符。 – bdares 2011-04-05 07:15:05