2011-04-05 17 views
3

(此算法適用於我正在開發的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)。

使用案例

這裏有幾個用例來解釋一下這個算法將有助於解決:

  1. 用戶購買產品A和產品B後來我們推出的產品C,其是一個產品A + B包裝在一起。通過C的UUID,我們希望我們的應用程序代碼能夠確定C實際上是A + B,並且由於用戶已經擁有A + B,因此C不會出現在可用產品列表中。

  2. 用戶有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本身,而是代碼中的實現 - 是如果其中一個被取代的產品取代了別的東西,則需要級聯。

任何指針我可以在這裏開始?

+0

您可以使用1個十六進制字符對16種類型進行編碼。 – bdares 2011-04-05 07:01:13

+0

@bdares,等等。我認爲你是對的,但後來我意識到我希望能夠說「這個產品支持這16個設備的任何SUBSET」,而不僅僅是16箇中的1個。在後一種情況下,你是對的。那麼,編碼「16的X」類型(其中X <= 16)所需的最小空間是多少? – makdad 2011-04-05 07:02:04

+0

1個十六進制字符可以是0-9,A,B,C,D,E,F ...,它們是16.如果每個字符代表1種設備,則設備可以用1個十六進制標識其類型字符。 – bdares 2011-04-05 07:15:05

回答

1

想想十進制或十六進制數字是一個壞主意,它只是浪費太多空間。

您的UUID字母表有65個(2 * 26 + 10 + 3)個字符。所以用n個字符可以編碼65^n個不同的值。 例如,x.x.x格式(其中x是0-99之間的數字)實際上只有100^3個不同的值,因此可以使用log65(100^3)〜3.31 = 4個字符進行編碼。 因此,對於前三個元數據,您需要1 + 4 + 1 = 9個字符,或者將三個字段log65(100^3 * 100^3 * 16)〜7.28 = 8個字符組合在一起。

對於產品取代級聯問題,我建議將UUID分成兩部分,第一部分包含一個簡短的UUID,第二部分包含元數據。當您引用被取代的產品時,請使用較短的UUID。

+0

你是對的,用你在這裏說的方法我可以節省一些空間。我也同意你將ID分成兩部分。我去做!你有沒有對最後一部分的建議,被取代的ID?我想擁有一個可以取代另一個ID的ID作爲自己的ID,這就是我遇到麻煩的地方。有什麼幫助嗎? – makdad 2011-04-06 00:08:56

+0

使用替代列表中的短ID,您不需要那裏的元數據。我不知道所有的要求,但是這解決了兩個用例。我錯過了什麼嗎? – 2011-04-06 09:45:07

+0

我重新讀你說的話,我想我明白你的觀點。因此,UUID可能如下所示:(設備等元數據)+(短UUID)+(引用其他UUID) – makdad 2011-04-07 04:06:48

1

這個數據是否需要人類可讀?

如果沒有,那麼也許你應該看看這個作爲串行化結構/對象到一個字節數組128

例如,你可以使用的格式的最大長度的問題(UID [INT], Device [byte],ArrayLength [byte],ProductID01 [int16],...),然後將所得到的字節數組與base64進行比較。或者,如果您發佈此數據並且不需要URL安全,那麼只需將它作爲char數組發送(基本上是base256)。我不知道你的限制,但你可以根據最大範圍調整數據類型。例如,如果您認爲數組長度永遠不會大於16,那麼您可以爲DeviceType和ArrayLength分割一個字節。

更好的是使用像protoBuf這樣的serlization框架。但我不知道它是否已經移植到iOS。

+0

偉大的問題。是的,最好是數據的人類可讀性。也就是說,我總是可以編寫一個shell腳本,或者在用戶回答問題後「吐出」UUID。最好能夠看到一個UUID並得到它的一般概念。 我的確喜歡base64的概念,因爲當product_ids處於人們可以看到它們的位置時(它是一個API),它可以掩蓋底層格式。 謝謝。 – makdad 2011-04-06 00:06:53

相關問題