2009-07-02 9 views
16

मैं प्रतिस्पर्धा में उपयोग किए जाने वाले 63 मिलियन अद्वितीय कोड उत्पन्न करने के "स्मार्ट" और "सुरक्षित" तरीके से आने का प्रयास कर रहा हूं। कोड लगभग 10 वर्ण लंबे होंगे।63 मिलियन पुरस्कार कोड कैसे उत्पन्न करें

क्या किसी ने भी इस समस्या से उत्पन्न होने वाले किसी भी "बाधाओं" के समान या जागरूक किया है? हम किसी को कोड अनुमान लगाने में सक्षम होने की संभावना को कम कैसे करते हैं?

यह प्रोजेक्ट PHP में किया जाएगा, लेकिन इससे कोई फर्क नहीं पड़ता है, यह तर्क है कि यह एक मुद्दा है जो यहां एक मुद्दा है।

कोई प्रतिक्रिया वास्तव में सराहना की जाएगी।

अद्यतन बस स्पष्ट करने के लिए यह 10 केस संवेदी अल्फा संख्यात्मक मान के वर्ण हो जाएगा। ए-जेड 0-9

उत्तर

30

सिंटेक्स:

आप शायद इन कोड को कॉपी लोग है, तो इसका मतलब है कि इन कोड को कॉपी करने के लिए आसान होना चाहिए होगा। 10^10 बहुत छोटा है, क्योंकि गेमकैट बताता है। kgiannakakis का एक बेहतर विचार है, लेकिन इससे एक और समस्या आती है: "1" बहुत "आई" जैसा दिखता है। "0", "सी", "ओ" और "क्यू" भी काफी समान हैं। यह एक बड़ी समस्या नहीं है। एक सुरक्षित अल्फाबेट परिभाषित करें: "ABDEFGHJKLMNPRSTUVXYZ" (सीओआईक्यू छोड़ देता है) टिप्पणियों से: आपके द्वारा चुने गए फ़ॉन्ट्स के आधार पर, 5/एस और यू/वी भी दृष्टि से संदिग्ध हो सकते हैं; आवश्यक के रूप में प्रतिस्थापित करें। यह एक 32 प्रतीक (5 बिट) कोड है। एक 10 वर्ण कोड 50 बिट्स संख्या है। जेनरेट करने, क्रमबद्ध करने, कॉपी करने, तुलना करने के लिए उनको काफी छोटा होना चाहिए। अनुमानित होने की संभावना लगभग 0.63 ई -7

चूंकि कोड याद रखने में बहुत लंबा हैं, इसलिए उपयोगकर्ताओं को कॉपी करते समय उपयोगकर्ताओं को आराम बिंदु की आवश्यकता होगी। तो स्ट्रिंग को दो या तीन भागों में विभाजित करें और सुनिश्चित करें कि इनपुट फ़ील्ड इस ब्रेकडाउन से मेल खाता है।

उदा। AKG3L-45TEE => 5 के दो समूह, और यदि आप 5 वर्णों को याद नहीं कर सकते हैं, तो भी उस बिंदु को ढूंढना बहुत आसान है जहां आपने पढ़ना बंद कर दिया था।


कैसे उन्हें उत्पन्न करने के लिए:

यह काफी सरल है। उम्मीदवारों को उत्पन्न करने के लिए आपको विशेष रूप से परिष्कृत एल्गोरिदम की आवश्यकता नहीं है। आप प्रति कोड आवश्यक 10 यादृच्छिक संख्या उत्पन्न कर सकते हैं, प्रत्येक संख्या से 5 बिट्स लें (आम तौर पर मध्यम बिट्स सर्वश्रेष्ठ होते हैं, उदाहरण के लिए (रैंड()/64) मॉड्यूल 32)। इस मान का उपयोग अपने वर्णमाला में इंडेक्स के रूप में करें [0-31]। प्राथमिक स्ट्रिंग के रूप में इस स्ट्रिंग के साथ डेटाबेस तालिका बनाएं, और तालिका में 63 मिलियन प्रविष्टियां होने तक डालें। आप शायद इस तालिका में "जेनरेट" और "रिडीम ऑन" तिथियां जोड़ना चाहते हैं।

+8

+1 भ्रमित मूल्यों को हटाने पर अच्छा बिंदु –

+0

और 32 प्रतीक होने से कुछ चीजों को भी सरल बनाया जा सकता है –

+4

अक्षर निबंध 'एस' और संख्या पांच '5' भी homomorphic हैं। – dwhall

0

एक सुरक्षित यादृच्छिक संख्या जनरेटर का उपयोग करें।

+1

अनुमान लगाने की संभावना: 63 * 10^6/10^10 = 1/15 9 – kgiannakakis

+1

मुझे पता नहीं है कि कोई इस पर +1 कैसे करता है क्योंकि कुछ हद तक संरक्षित नहीं होने पर थोड़ा अशुभ है :) –

+0

मुझे नहीं लगता कि किसी ने वर्णों को कहा है संख्या होना चाहिए। [0-9 ए-जेड] 63 * 10^6/36^10 = 17/1000000000 देता है। [0-9 ए-जेड] 63 * 10^6/62^10 = 75/1000000000000 देता है। –

0

यदि वे अद्वितीय प्रतिभागियों के लिए हैं, तो आप प्रत्येक प्रतिभागियों का नाम (और/या) विवरण हैश कर सकते हैं और फिर पहले 10 वर्णों तक काट सकते हैं।

+1

हैश, तकनीकी रूप से, हालांकि हमेशा अद्वितीय नहीं हो सकता है। – Sampson

+0

कोड उत्पादों पर वितरित किए जाएंगे, और फिर दावा किया जाएगा, इसलिए मूल्य बनाने के लिए प्रतिभागी के साथ कोई संबंध नहीं है। –

+0

@ शादी - ओह। तब मेरी माफ़ी @ जोनाथन - निश्चित रूप से, इसलिए मैंने उनसे इनपुट स्ट्रिंग को काफी लंबा बनाने के लिए हैश बनाने में अधिक जानकारी जोड़ने के लिए कहा। हालांकि मुझे नहीं पता कि 63 मीटर में संघर्ष की संभावना कितनी अधिक होगी। लेकिन फिर भी अन्य उत्तरों बहुत बेहतर हैं। मुझे यूयूआईडी भी नहीं पता था। :) – OrangeRind

0

हो सकता है कि यह आप एक छोटे से मदद मिलेगी: Universal Unique Identifier

UUIDs के इरादे वितरण प्रणाली सक्षम करने के लिए विशिष्ट महत्वपूर्ण केंद्रीय समन्वय के बिना जानकारी की पहचान है। इस प्रकार, कोई भी यूयूआईडी बना सकता है और का उपयोग के साथ कुछ पहचानने के लिए उचित विश्वास है कि पहचानकर्ता कभी भी के लिए किसी भी व्यक्ति द्वारा अनजाने में उपयोग नहीं किया जाएगा।

+1

लिंक की मरम्मत करें, आप अंतिम 'आर' :) – OrangeRind

+1

यूयूआईडी v4 में जोड़ना भूल गए हैं, यह केवल एन्ट्रॉपी का अपशिष्ट है - आप अधिकतर डेटा को फेंक रहे हैं। अन्य यूयूआईडी संस्करणों में, डेटा इतना यादृच्छिक नहीं हो सकता है (एनआईसी मैक पता और सिस्टम समय - या उनमें से हैंश - वास्तव में यादृच्छिक डेटा स्रोत नहीं हैं)। – drdaeman

+0

धन्यवाद धन्यवाद ... लान कॉपी और पेस्ट;) हाँ मुझे पता है कि मशीन के लिए यह वास्तव में बहुत यादृच्छिक संख्या उत्पन्न करने के लिए बहुत मुश्किल है। वास्तव में यादृच्छिक डेटा की उस बड़ी राशि के लिए सबसे अच्छा संभवतः शारीरिक प्रयोग (रेडियोधर्मी क्षय) से कुछ माप डेटा प्राप्त करना होगा क्योंकि इन्हें स्वाभाविक रूप से यादृच्छिक माना जाता है (कम से कम मशीन जनरेटर से अधिक)। – Daff

2

PHP में अल्फा-न्यूमेरिक स्ट्रिंग बनाने के लिए यह link देखें। यह 36 अक्षरों के वर्णमाला का उपयोग करता है, जो पर्याप्त सुरक्षित होना चाहिए। हालांकि विशिष्टता की गारंटी नहीं है। मुझे लगता है कि आप इसे लागू करने के लिए एक सेट का उपयोग कर सकते हैं। चूंकि यह केवल एक बार का ऑपरेशन है, डुप्लीकेट के लिए परीक्षण के लिए समय देरी एक बड़ा सौदा नहीं होना चाहिए।

+0

हां आप सही हैं, क्योंकि डेटा सेट किया जा रहा है, यह जांचना बहुत मुश्किल नहीं है कि डीबी में रखकर कोई कोड मौजूद है या नहीं, और अगर यह नहीं हो रहा है तो इसे छोड़ना। –

+1

64 मिलियन कोड उत्पन्न करने, क्रमबद्ध करने और डुप्लिकेट की जांच करने के लिए तेज़ है। केवल ओ (एन लॉग एन)। – MSalters

+0

@MSlaters: आप डुप्लिकेट चेक कैसे करेंगे? –

5

0 - 2 -1 पर वास्तव में यादृच्छिक, अद्वितीय 64-बिट संख्याओं का एक सेट उत्पन्न करें। आपको उन लोगों का ट्रैक रखने की आवश्यकता होगी जिन्हें आपने देखा है और डुप्लीकेट को अस्वीकार कर दिया है। 32-वर्ण वर्णमाला से इस संख्या के निचले 50 बिट्स के प्रत्येक 5 बिट्स का उपयोग करें - मूल रूप से अंग्रेजी वर्णमाला (ऊपरी या निचले भाग) में सभी अक्षरों एल और ओ के साथ-साथ अंकों 2-9 (यह एल के बीच भ्रम को कम करता है)/1 और 0/ओ)। 63 मिलियन कोड के लिए, यह आपको एक वैध कोड अनुक्रम यादृच्छिक रूप से चुनने के लिए 0.000006% संभावना (63,000,000/2) देगा।

मैंने इसे एक ऑटो-जेनरेटेड, प्राथमिक कुंजी (int) और 32-बिट यादृच्छिक मान के साथ बिट-इंटरलिविंग का उपयोग करके भी किया है। इस मामले में मैंने वर्णमाला से 13 वर्ण उत्पन्न करने के लिए पूर्ण 64-बिट्स का उपयोग किया और 15-वर्ण कोड के लिए निश्चित स्थिति में दो यादृच्छिक वर्ण जोड़े। कोड को रिडीम करते समय आप कुंजी और यादृच्छिकता निकालने के लिए एल्गोरिदम को उलट देते हैं, दो अतिरिक्त यादृच्छिक वर्णों को फेंक देते हैं, फिर कोड को सत्यापित करने के लिए कुंजी के साथ संग्रहीत यादृच्छिकता की तुलना करें।

10

यदि मैं आपको सही ढंग से समझता हूं, तो आप 10 अंकों के 63 मिलियन कोड बनाना चाहते हैं जिनमें कम "अनुमान कारक" है।

10,000,000,000 मान्य संयोजन हैं। इनमें से 63,000,000 मूल्य संख्याएं हैं। 63/10,000 = 0.0063। तो प्रत्येक अनुमान में सफलता का 0,63% मौका है। उच्च ध्वनि नहीं है, लेकिन क्रूर बल के साथ, संख्याएं प्राप्त करना काफी आसान है।

क्या आप सुनिश्चित हैं कि 63 से 10,000 अनुपात पर्याप्त है?

+2

यह एक अच्छा मुद्दा है। –

+2

दशमलव अंकों का उपयोग न करने का एक अच्छा कारण; kgiannakakis – MSalters

+0

देखें उन्होंने विशेष रूप से अक्षर कहा, अंक नहीं। एक अच्छी चेतावनी, लेकिन मुझे लगता है कि वह पहले से ही वह हो जाता है। – tvanfosson

0

आप कहते हैं कि कोड 10 'वर्ण' लंबे हैं, लेकिन आपका चरित्र सेट क्या है?

यदि यह केवल अंक है, तो (@Gamecat) शायद यह एक कोड को यादृच्छिक रूप से अनुमान लगाने के लिए थोड़ा आसान होगा।

दूसरी तरफ, यदि चरित्र सेट अक्षर + अंक है, तो आपके पास बहुत सारी सुरक्षा है।

किसी भी मामले में सुरक्षित यादृच्छिक संख्या जनरेटर का उपयोग करके उत्पन्न करें, और डेटाबेस में डालने से पहले डुप्लिकेट की जांच करें।

4

कोड के लिए अल्फान्यूमेरिक्स का उपयोग करते समय सावधान रहें, क्योंकि आप गलती से भ्रमित या शर्मनाक कुछ भी उत्पन्न नहीं करना चाहते हैं। भ्रम से बचने के लिए मैं 1 और एल, 0 और ओ, और शायद 8 और बी को हटाने का सुझाव देता हूं। शर्मिंदगी से बचने के लिए सभी स्वरों को हटाने पर विचार करें ताकि आप गलती से कुछ भी जादू नहीं कर सकें (यहां अपनी कल्पना का उपयोग करें)।

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