2017-03-15 11 views
5

मैं एक ऐसी प्रणाली पर काम कर रहा हूं जो 2 अरब एक दिन में अद्वितीय यूयूआईडी उत्पन्न करता है। यूयूआईडी क्लाइंट पर जावास्क्रिप्ट \ फ्लैश (एएस 3) का उपयोग करके उत्पन्न होते हैं।जावास्क्रिप्ट और एएस 3 में वास्तव में अद्वितीय यूयूआईडी उत्पन्न करना - पीआरएनजी और अंतर्निहित एल्गोरिदम

हमने हाल ही में देखा है कि हमारे यूयूआईडी अद्वितीय नहीं हैं। हमारे पास दैनिक डुप्लीकेट के लगभग 20% (!) हैं, जिनमें से अधिकतर (ट्रैफिक वॉल्यूम के सापेक्ष) क्रोम से आ रहे हैं।

मैं सबसे ब्राउज़रों पर some readingand learnedthat the pseudo-random पीढ़ी (PRNG) एल्गोरिथ्म कार्यान्वयन, और विशेष रूप से क्रोम किया था, त्रुटिपूर्ण है। क्रोमियम और नोड.जेएस वी 8 जावास्क्रिप्ट इंजन का उपयोग करते हैं, जो MWC1616 नामक एल्गोरिदम लागू करता है।

सिद्धांत रूप में, एक अच्छा पीआरएनजी का उपयोग करके उत्पन्न यूयूआईडी को टक्कर के लिए 2132 probability होना चाहिए, लेकिन कुछ वास्तविक यथार्थवादी परिदृश्यों के तहत MWC1616 के साथ, यह संभावना लगभग 1: 30000 है। , आईपी, यूए की तरह कुछ जानकारी hashing द्वारा

  1. सर्वर (जाओ का प्रयोग करके)
  2. ग्राहक पर एक मजबूत आईडी उत्पन्न पर ID उत्पन्न:

    समस्या को हल करने के लिए, मैं निम्नलिखित विकल्पों पर विचार किया यूयूआईडी के साथ, टाइमस्टैम्प, आदि।

  3. एक बेहतर यादृच्छिक जनरेटर के साथ Math.random() को बदलना।

जब से मैं ग्राहक पर बातें रखना पसंद करते हैं और मैं पहिया फिर से आविष्कार और UUID निर्माण तर्क संशोधित करने के लिए नहीं करना चाहते, मैं 3.

अच्छी खबर हैं विकल्प के साथ रहना चाहते हैं कि नए ब्राउज़रों पर, getRandomValues एपीआई है। दुर्भाग्यवश, मुझे पुराने ब्राउज़र का समर्थन करने की आवश्यकता है।

तो मेरी प्रश्न हैं:

  1. क्या

crypto.getRandomValues ​​()

के लिए एक अच्छा और विश्वसनीय जावास्क्रिप्ट polyfill (कि गणित का उपयोग नहीं करता है आंतरिक रूप से यादृच्छिक)?

  1. क्या AS3 Math.random() ब्राउज़र के Math.random() का उपयोग करता है? क्या यह वही एल्गोरिदम स्वयं लागू करता है?

  2. क्या फ़्लैश.crypto.generateRandomBytes() Math.random() का उपयोग करता है? क्या यह crypto.getRandomValues ​​() का उपयोग करता है? यदि नहीं, तो कौन सा एल्गोरिदम लागू करता है और क्या यह एएस 3 में एक ही मुद्दे के लिए एक अच्छा समाधान होगा? यदि नहीं, तो आप कौन सी एएस 3 क्रिप्टो लाइब्रेरी की सिफारिश करेंगे?

पीएस मैं उन लेखों की अत्यधिक अनुशंसा करता हूं जिनका मैंने उल्लेख किया है -1--2--3-। मैं कई वर्षों से Math.random() के मुद्दों से अवगत था, लेकिन इस लेख ने वास्तव में मुझे अच्छे के लिए स्पष्ट किया।

+2

AS3 का Math.random() ब्राउज़र स्वतंत्र है लेकिन अभी भी छद्म-यादृच्छिक है। एएस 3 में UIDUtil.createUID() विधि है लेकिन जैसा कि दस्तावेज़ों में बताया गया है "यह यूआईडी वास्तव में वैश्विक रूप से अद्वितीय नहीं होगा, लेकिन यह सर्वोत्तम है कि हम यूआईडी पीढ़ी के लिए खिलाड़ी समर्थन के बिना कर सकते हैं।" मैं GUID पीढ़ी के लिए इस कक्षा का उपयोग कर रहा हूं और यह अब तक बहुत अच्छी तरह से काम करता है (प्रति दिन कुछ हजार जनरेटेड आईडी के साथ): http://snipplr.com/view/45247/as3-globally-unique-identifier-guid/ – Philarmon

+0

@ फिलमर्मन - मुझे संदेह है कि यह हमारे भार के लिए पर्याप्त नहीं होगा - 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

एक सप्ताह से अधिक समय तक शोध करने के बाद - मेरा निष्कर्ष यह है: ग्राहक पर कभी भी यूआईआईडी उत्पन्न नहीं करें। बस मत करोविशेष रूप से यदि आप पैमाने पर करना चाहते हैं।

सालों से, मुझे पता था कि ब्राउजर का गणित। यादृच्छिक कार्यान्वयन खराब था, लेकिन मुझे समझ में नहीं आया कि यह कितना बुरा था, जब तक कि हम प्रति दिन अरबों कार्यक्रमों के पैमाने तक नहीं पहुंच जाते।

मैंने सबसे आसान तकनीकी समाधान के साथ जाने का निर्णय लिया और यूयूआईडी पीढ़ी को सर्वर पर ले जाया। ~ 25% से ~ 0.0008% से नीचे डुप्लिकेट आईडी का प्रतिशत।

पीएस हमारा सर्वर गो में लागू किया गया है। Node.js जावास्क्रिप्ट वी 8 इंजन का उपयोग करता है और इसमें एक ही समस्या हो सकती है। हालांकि ऐसा लगता है कि आप नवीनतम Node.js का उपयोग कर रहे हैं, तो आपको ठीक होना चाहिए।

+1

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

+0

मुझे नहीं लगता कि अब तक यह कहना आवश्यक है कि "क्लाइंट पर यूयूआईडी उत्पन्न न करें"। एक ही समय में एक कैनोनिकल आईडी बनाने के लिए लाभों का एक टन है, जब आप एक डेटा इकाई बनाते हैं, जो हमारी तेजी से मोबाइल केंद्रित दुनिया में, ग्राहक पर अधिक से अधिक होता है। और यह भी ध्यान दें कि जैसे ही आपको एक सर्वर से बाहर स्केल करना होगा, सर्वर पर आईडी उत्पन्न करने वाले सभी मुद्दों में आप भाग लेते हैं। असली लेआउट यहां कभी नहीं मानना ​​है कि आपकी आईडी अद्वितीय होने की गारंटी है। इस जगह के लिए चेक डालें और टकराव होने पर कृपापूर्वक विफल हो जाएं। – broofa

संबंधित मुद्दे