我正在研究每天產生大約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。
爲了解決這個問題,我認爲以下選項:
- 生成(使用GO)
- 生成客戶端具有更強的ID在服務器上的ID,通過散列如IP,UA一些信息,時間戳等與UUID。
- 用更好的隨機生成器替換Math.random()。
因爲我喜歡保持事情在客戶端上,我不想重新發明輪子和修改UUID創建邏輯,我想選擇堅持3
好消息是在較新的瀏覽器上,有getRandomValues api。不幸的是,我需要支持舊版瀏覽器。
所以我的問題是:
- 是一個良好的,可靠的JavaScript填充工具爲
crypto.getRandomValues()
(不使用數學.random內部)?
AS3 Math.random()使用瀏覽器的Math.random()嗎?它是否自己實現相同的算法?
flash.crypto.generateRandomBytes()使用Math.random()嗎?它使用crypto.getRandomValues()嗎?如果不是,它實現了哪種算法,並且它將成爲AS3中同樣問題的一個很好的解決方案?如果不是,你會推薦哪個AS3加密庫?
P.S.我強烈推薦我提到的文章-1--2--3-。我很早就意識到Math.random()的問題,但這篇文章真正向我清楚地表明瞭它的好處。
AS3的Math.random()是獨立於瀏覽器的,但仍然是僞隨機的。 AS3有一個UIDUtil.createUID()方法,但正如文檔中所述:「這個UID並不是真正的全球唯一;但是如果沒有玩家支持UID生成,這是最好的。」我使用這個類來生成GUID,到目前爲止效果很好(每天有幾千個生成的ID):http://snipplr.com/view/45247/as3-globally-unique-identifier-guid/ – Philarmon
@Philarmon - 我懷疑這對我們的負載不夠好 - UIDUtil的實現與我目前的實現非常相似 - 使用Math.random。你有沒有使用crypto.generateRandomBytes的經驗? – Lizozom
嘗試'forge.random.getBytesSync(numbytes);'看起來僞造的[random.js](https://github.com/digitalbazaar/forge/blob/master/lib/random.js)使用自己的隨機生成器時' window.crypto.getRandomValues()'不可用,可以使用'forge.options.usePureJavaScript = true;' – pedrofb