2008-08-29 21 views
13

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

Af3nT5Xf2 

दुर्भाग्य से, मैं कार्यान्वयन से संतुष्ट नहीं था:

यह उन मानों के कुछ इस तरह देखा पैदा करने समाप्त हो गया। ग्विड सवाल से बाहर थे, वे उपयोगकर्ताओं के लिए टाइप करने के लिए बस बहुत बड़े और मुश्किल थे। मैं 4 या 5 अक्षरों/अंकों की रेखाओं के साथ कुछ और करने की उम्मीद कर रहा था, लेकिन अगर हम एन्कोड करते हैं तो हमारा विशेष कार्यान्वयन ध्यान से पैटर्न वाले अनुक्रम उत्पन्न करेगा 9 से कम वर्ण।

हम डेटाबेस से एक अनूठा अनुक्रमिक 32bit आईडी खींच लिया:

यहाँ है कि हम क्या कर समाप्त हो गया है। इसके बाद हमने इसे 64 बिट रैंडम पूर्णांक के केंद्र बिट्स में डाला। हमने आसानी से टाइप किए गए और पहचाने गए पात्रों की एक लुकअप टेबल बनाई है (ए-जेड, ए-जेड, 2-9 एल, एल, 1, ओ, 0 इत्यादि जैसे आसानी से उलझन वाले पात्रों को छोड़कर)। आखिरकार, हमने बेस-54 को 64-बिट पूर्णांक एन्कोड करने के लिए उस लुकअप टेबल का उपयोग किया। उच्च बिट यादृच्छिक थे, कम बिट्स यादृच्छिक थे, लेकिन केंद्र बिट्स अनुक्रमिक थे।

अंतिम परिणाम एक कोड था जो एक गाइड से बहुत छोटा था और यादृच्छिक लग रहा था, भले ही यह बिल्कुल नहीं था।

मैं इस विशेष कार्यान्वयन से कभी संतुष्ट नहीं था। तुमने क्या किया होगा?

+1

आपको अनुक्रमिक मूल्य की आवश्यकता क्यों है? क्या आप इसे वापस ले चुके हैं? यदि हां, तो एक गुप्त कुंजी के साथ अपने अनुक्रमिक संख्या को एन्क्रिप्ट करने के लिए क्रिप्टो फ़ंक्शन का उपयोग करें और सिफर को अपनी पसंद के अनुसार वर्णमाला के साथ एन्कोड करें। – Oli

उत्तर

3

सी # में, मैंने 'System.IO.Path.GetRandomFileName() : String' विधि का उपयोग किया है ... लेकिन मैं डीबग फ़ाइल नामों के लिए नमक पैदा कर रहा था। यह विधि उन चीज़ों को लौटाती है जो आपके पहले उदाहरण की तरह दिखती हैं, यादृच्छिक '.xyz' फ़ाइल एक्सटेंशन को छोड़कर भी।

यदि आप .NET में हैं और बस एक सरल (लेकिन 'अच्छा' दिखने वाला नहीं) समाधान चाहते हैं, तो मैं कहूंगा कि यह है ... यदि आप चाहें तो यादृच्छिक फ़ाइल एक्सटेंशन को हटा सकते हैं।

3

.NET में आप RNGCryptoServiceProvider विधि GetBytes() का उपयोग कर सकते हैं जो "यादृच्छिक मानों के क्रिप्टोग्राफ़िक रूप से मजबूत अनुक्रम के साथ बाइट्स की सरणी भरें" (एमएस दस्तावेज़ीकरण से)।

byte[] randomBytes = new byte[4]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(randomBytes); 

आप बाइट सरणी के लेंस को बढ़ा सकते हैं और उन चरित्र मानों को निकाल सकते हैं जिन्हें आप अनुमति देना चाहते हैं।

7

यहां मैं यह कैसे करूँगा।

मुझे उपयोग आवृत्ति और कुछ व्याकरण संबंधी जानकारी के साथ सामान्य अंग्रेजी शब्दों की एक सूची प्राप्त होगी (जैसे यह एक संज्ञा या क्रिया है?)। मुझे लगता है कि आप कुछ प्रतिलिपि के लिए इंटरबिट्स के चारों ओर देख सकते हैं। फ़ायरफ़ॉक्स ओपन-सोर्स है और इसमें एक वर्तनी जांचकर्ता है ... इसलिए इसे किसी भी तरह से उपलब्ध होना चाहिए।

तब मैं उस पर एक फ़िल्टर चलाऊंगा ताकि अस्पष्ट शब्द हटा दिए जाएं और जो शब्द बहुत लंबे हैं उन्हें बाहर रखा गया है।

तब मेरी पीढ़ी एल्गोरिदम सूची से 2 शब्द उठाएगी और उन्हें जोड़ देगा और एक यादृच्छिक 3 अंक संख्या जोड़ देगा।

मैं भी क्रिया के बीच शब्द चयन पैटर्न randomize कर सकते हैं/

eatCake778
pickBasket524 तरह संज्ञाओं
rideFlyer113 आदि ..

मामले ऊंट आवरण होने की जरूरत नहीं, आप इसे यादृच्छिक बना सकते हैं। आप संख्या और क्रिया/संज्ञा के प्लेसमेंट को यादृच्छिक भी बना सकते हैं।

और चूंकि यह बहुत यादृच्छिक है, जेफ का The Danger of Naïveté एक जरूरी है। पहले से ही शब्दकोश हमलों का अध्ययन करना सुनिश्चित करें।

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

+0

आम अंग्रेजी शब्द एक छोटे से जैसी साइट के लिए अच्छा नहीं होगा। आप पासवर्ड जेनरेटर आईएमओ का अधिक वर्णन कर रहे हैं। – dfrankow

+0

@dfrankow प्रश्न से "हमारे वेब एप्लिकेशन के लिए अद्वितीय और यादृच्छिक कोड। कोड को उपयोगकर्ता के अनुकूल और जितना संभव हो सके छोटा होना चाहिए, लेकिन फिर भी अनिवार्य रूप से यादृच्छिक होना चाहिए" ... मुझे क्या याद आती है? – chakrit

0

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

आप एक तरह से URL स्ट्रिंग जो एक मुद्दा मैं थोड़ी देर तो के लिए के साथ पेश किया है में एक यादृच्छिक कोड एन्कोड करने के लिए तलाश कर रहे हैं, हालांकि मैं क्या मैंने किया है 64-बिट इनकोडिंग GUIDs का उपयोग करें।

0

आप शब्दों की अपनी सूची लोड कर सकते हैं जैसे कि डेटा तालिका या एक्सएमएल फ़ाइल में एक अद्वितीय अनुक्रमिक कुंजी के साथ वर्णित चक्र। अपना यादृच्छिक शब्द प्राप्त करते समय, यह निर्धारित करने के लिए यादृच्छिक संख्या जनरेटर का उपयोग करें कि उनके कुंजी द्वारा कौन से शब्द लाए जाएं। यदि आप उनमें से 2 को जोड़ते हैं, तो मुझे नहीं लगता कि आपको स्ट्रिंग में संख्याओं को शामिल करने की आवश्यकता है जब तक कि "वास्तविक यादृच्छिकता" लक्ष्य का हिस्सा न हो।