2009-01-21 10 views
7

मैं एक साधारण अल्पकालिक आरक्षण प्रणाली बनाने के लिए देख रहा हूँ, और मैं पुष्टिकरण संख्या किएक अद्वितीय अक्षरांकीय 10-चरित्र स्ट्रिंग

  • अद्वितीय
  • यादृच्छिक दिखने
  • हैं जेनरेट करना चाहते हैं बनाना
  • अक्षरांकीय
  • कम-ish, कम से कम की तुलना में बहुत कम 32 चरित्र के लंबे तार SHA1 द्वारा दिया

मैं केवल देख रहा हूँ ~ 500 आरक्षण होने के लिए, इसलिए संकुचन की उच्च संभावना की कल्पना नहीं करता है।

एक विचार जो मैंने किया था वह दिनांक-समय टिकट और उपयोगकर्ता नाम के आधार पर एक sha1 हैश उत्पन्न करता है, फिर इसे अपने पहले 10 वर्णों में छोटा कर देता है। क्या ऐसा कुछ ~ 500 आरक्षण संसाधित करने के प्रयोजनों के लिए पर्याप्त रूप से अद्वितीय होगा?

sub get_random_name() 
{ 
    my @chars=('a'..'z','A'..'Z'); 
    my $random_string;

foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }

मुझे याद नहीं कब तक समय() हिस्सा है, तो आप अपने लंबाई फिट करने के लिए संख्या को समायोजित करने के लिए हो सकता है:

उत्तर

4

SHA-1 हैश के किसी दिए गए बिट की यादृच्छिकता में कोई अंतर नहीं होना चाहिए, इसलिए यह संभव है। एक और तरीका हैश को एक्सओआर का उपयोग करके अपने आप में जोड़ना होगा जब तक आपके पास 60 बिट्स डेटा नहीं है, फिर अधिकतर अल्फा-न्यूमेरिक परिणाम प्राप्त करने के लिए Base 64 का उपयोग करके इसे एन्कोड करें।

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

+2

मैं आधार 32 के बजाय सुझाव दे सकता है? अगर किसी भी इंसान को इस अनुक्रम को प्रतिलिपि बनाना होगा, तो क्रॉकफोर्ड का बेस 32 बहुत बेहतर विकल्प है http://crockford.com/wrmg/base32.html – Breton

2

यहाँ एक ही रास्ता पर्ल में यह करने के लिए है। यदि आपको इसकी आवश्यकता नहीं है तो आप उस भाग को भी हटा सकते हैं।

3

आप जो भी, एक सादा यादृच्छिक संख्या जनरेटर का उपयोग कर सकते हैं; हालांकि, आपको यह जांचना चाहिए कि आरक्षण कोड पहले से मौजूद नहीं है। यदि ऐसा है, तो स्ट्रिंग (दिनांक + उपयोगकर्ता) तक अक्षर ('x') जोड़ें जब तक कि आपको कोई नया यादृच्छिक/sha1/etc प्राप्त न हो जाए।

मुझे केवल ~ 500 आरक्षण मिल रहे हैं, इसलिए मुझे उम्मीदों की उच्च संभावना की कल्पना नहीं है।

एक और बेवकूफ विचार: 1000 या 2000 वांछित गुणों के साथ अद्वितीय यादृच्छिक संख्या उत्पन्न करते हैं, उन्हें कहीं स्टोर, और उन्हें उपयोगकर्ताओं को असाइन के रूप में वे register :)

0

एक GUID का उपयोग करें? 16 वर्ण, हालांकि अगर आपको वास्तव में टकराव की परवाह नहीं है, तो आप केवल पहले एन अक्षर चुन सकते हैं।

+0

ध्यान दें कि GUID की सबस्ट्रिंग सभी अद्वितीय http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx – Eclipse

+0

गाइड एल्गोरिदम केवल विशिष्टता की गारंटी दे रहा है, आप जेनरेट किए गए ग्रिड को यादृच्छिक होने के लिए नहीं मान सकते हैं जो उपयोग के लिए एक आवश्यकता होगी सत्र आईडी। –

+0

यह भी देखें http://stackoverflow.com/questions/467271/how-random-is-system-guid-newguid#467296 –

1

इस प्रश्न पर कुछ अच्छी टिप्स: How do I create a random alpha-numeric string in C++?

मैं की तरह "1", "l", और "ओ", "0" और "5", "एस", और "वर्ण शामिल होने से बचाया था जेड "," 2 "आपकी स्ट्रिंग में, ग्राहकों के लिए आसान बनाने के लिए जब उन्हें फोन पर अपना आरक्षण कोड पढ़ने की आवश्यकता होती है। उस लिंक पर प्रस्तुत एल्गोरिदम आपको ऐसा करने में मदद करेगा।

2

यदि यह वास्तव में केवल 500 है, तो उनमें से 20,000 को एक तालिका में पूर्व-उत्पन्न करें, फिर आपको "अगली अप्रयुक्त" प्राप्त करें जब आपको इसकी आवश्यकता हो।

+1

क्यों न केवल 500 उत्पन्न करें? – NimChimpsky

+0

यदि आप भविष्य में निष्पादन में उपयोग के लिए जेनरेटर चुनना चाहते हैं, तो आपको मूल्यों को बनाए रखने के बाद के बाद के निष्पादन के बाद मसालेदार जनरेटर को ओवरराइट करना होगा। –

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