2017-03-15 28 views
5

我正在研究每天產生大約20億唯一UUID的系統。 UUID使用客戶端上的JavaScript \ Flash(AS3)生成。在JavaScript和AS3中生成真正獨特的UUID - PRNG和基本算法

我們最近注意到我們的UUID沒有接近唯一的地方。我們有大約20%(!)的每日重複,其中大部分(相對於流量)來自鉻。

我做過some readingand learnedthat the pseudo-random第一代(PRNG)算法在大多數瀏覽器上的實現,尤其是chrome,存在缺陷。 Chromium和Node.js使用V8 javaScript引擎,它實現了一種名爲MWC1616的算法。

理論上,使用良好的PRNG產生的UUID應該具有用於​​碰撞的2132 probability,但對於MWC1616,在一些非常現實的情況下,該概率約爲1:30000。

爲了解決這個問題,我認爲以下選項:

  1. 生成(使用GO)
  2. 生成客戶端具有更強的ID在服務器上的ID,通過散列如IP,UA一些信息,時間戳等與UUID。
  3. 用更好的隨機生成器替換Math.random()。

因爲我喜歡保持事情在客戶端上,我不想重新發明輪子和修改UUID創建邏輯,我想選擇堅持3

好消息是在較新的瀏覽器上,有getRandomValues api。不幸的是,我需要支持舊版瀏覽器。

所以我的問題是:

  1. 是一個良好的,可靠的JavaScript填充工具爲

crypto.getRandomValues()

(不使用數學.random內部)?

  1. AS3 Math.random()使用瀏覽器的Math.random()嗎?它是否自己實現相同的算法?

  2. flash.crypto.generateRandomBytes()使用Math.random()嗎?它使用crypto.getRandomValues()嗎?如果不是,它實現了哪種算法,並且它將成爲AS3中同樣問題的一個很好的解決方案?如果不是,你會推薦哪個AS3加密庫?

P.S.我強烈推薦我提到的文章-1--2--3-。我很早就意識到Math.random()的問題,但這篇文章真正向我清楚地表明瞭它的好處。

+2

AS3的Math.random()是獨立於瀏覽器的,但仍然是僞隨機的。 AS3有一個UIDUtil.createUID()方法,但正如文檔中所述:「這個UID並不是真正的全球唯一;但是如果沒有玩家支持UID生成,這是最好的。」我使用這個類來生成GUID,到目前爲止效果很好(每天有幾千個生成的ID):http://snipplr.com/view/45247/as3-globally-unique-identifier-guid/ – Philarmon

+0

@Philarmon - 我懷疑這對我們的負載不夠好 - UIDUtil的實現與我目前的實現非常相似 - 使用Math.random。你有沒有使用crypto.generateRandomBytes的經驗? – Lizozom

+1

嘗試'forge.random.getBytesSync(numbytes);'看起來僞造的[random.js](https://github.com/digitalbazaar/forge/blob/master/lib/random.js)使用自己的隨機生成器時' window.crypto.getRandomValues()'不可用,可以使用'forge.options.usePureJavaScript = true;' – pedrofb

回答

2

經過一個多星期的研究,我的結論是:從不在客戶端生成UUID。不要。特別是如果你打算擴展。

多年來,我知道瀏覽器的Math.random實現很差,但我不明白它有多糟,直到我們達到每天數十億事件的規模。

我決定使用最簡單的技術解決方案,並將UUID生成移到服務器。重複ID從〜25%一天下降到〜0.0008%的百分比。

P.S.我們的服務器在Go中實現。 Node.js使用JavaScript V8引擎,並可能有相同的問題。儘管看起來如果你使用最新的Node.js,你應該沒問題。

+1

http://dilbert.com/strip/2001-10-25 :) –

+0

我不認爲有必要說「不要在客戶端生成UUID」。在創建一個數據實體的同時,創建一個規範化的ID有很多好處,在我們越來越以移動爲中心的世界中,越來越多地發生在客戶端。並且請注意,只要您必須擴展到單個服務器之外,就會遇到在服務器上生成ID的所有相同問題。這裏真正的賣點是永遠不要假設你的ID是唯一的。對此進行檢查並在碰撞發生時適當地失敗。 – broofa