यदि मैं आपका प्रश्न सही ढंग से पढ़ता हूं, तो आप कुछ मनमानी पहचानकर्ता टोकन उत्पन्न करना चाहते हैं जो 21 वर्ण अधिकतम होना चाहिए। अनुमान लगाने के लिए इसे अत्यधिक प्रतिरोधी होने की आवश्यकता है? आपके द्वारा दिया गया उदाहरण "क्रिटोग्राफिक रूप से मजबूत" नहीं है, जिसमें पूरे संभव कुंजीपटल के 1/2 से कम खोज करके अनुमान लगाया जा सकता है।
आप यह नहीं कहते कि पात्र सभी 256 ASCII वर्ण हो सकते हैं, या यदि इसे सीमित करने की आवश्यकता है, तो कहें, प्रिंट करने योग्य ASCII (33-127, समावेशी), या कुछ छोटी रेंज।
UUID एस (यूनिवर्सल अद्वितीय पहचानकर्ता) के लिए डिज़ाइन किया गया एक पायथन मॉड्यूल है। आप संभवतः uuid4 चाहते हैं जो एक यादृच्छिक यूयूआईडी उत्पन्न करता है, और उपलब्ध होने पर ओएस समर्थन का उपयोग करता है (लिनक्स, मैक, फ्रीबीएसडी, और अन्य लोगों पर)।
>>> import uuid
>>> u = uuid.uuid4()
>>> u
UUID('d94303e7-1be4-49ef-92f2-472bc4b4286d')
>>> u.bytes
'\xd9C\x03\xe7\x1b\xe4I\xef\x92\xf2G+\xc4\xb4(m'
>>> len(u.bytes)
16
>>>
16 यादृच्छिक बाइट्स बहुत unguessable है, और, पूर्ण 21 बाइट्स अपने एपीआई की अनुमति देता है का उपयोग करने के अगर सभी आप चाहते हैं एक unguessable अपारदर्शी पहचानकर्ता है कोई आवश्यकता नहीं है।
यदि आप कच्चे बाइट्स का उपयोग नहीं कर सकते हैं, जो शायद एक बुरा विचार है क्योंकि लॉग और अन्य डीबग संदेशों में उपयोग करना कठिन होता है और आंखों की तुलना करना कठिन होता है, तो बाइट्स को कुछ और पठनीय में परिवर्तित करें, , आधार -64 एन्कोडिंग का उपयोग के साथ परिणाम 21 (या जो भी) के लिए नीचे कटा तरह बाइट्स:
>>> u.bytes.encode("base64")
'2UMD5xvkSe+S8kcrxLQobQ==\n'
>>> len(u.bytes.encode("base64"))
25
>>> u.bytes.encode("base64")[:21]
'2UMD5xvkSe+S8kcrxLQob'
>>>
यह आपको लंबाई 21 की एक अत्यंत उच्च गुणवत्ता यादृच्छिक स्ट्रिंग देता है।
आप पसंद नहीं हो सकता है '+' या '/' जो एक आधार -64 स्ट्रिंग में हो सकता है, उचित एस्केपिंग बिना के बाद से है कि यूआरएल के साथ हस्तक्षेप कर सकते हैं। चूंकि आप पहले से ही "यादृच्छिक 3 वर्ण" का उपयोग करना चाहते हैं, मुझे नहीं लगता कि यह आपकी चिंता है। यदि ऐसा है, तो आप उन पात्रों को किसी अन्य चीज़ से बदल सकते हैं ('-' और '।' काम कर सकते हैं), या उपस्थित होने पर उन्हें हटा दें।
जैसा कि अन्य ने इंगित किया है, आप .encode ("हेक्स") का उपयोग कर सकते हैं और हेक्स समकक्ष प्राप्त कर सकते हैं, लेकिन यह केवल 4 बिट्स यादृच्छिकता/चरित्र * 21 वर्ण अधिकतम आपको दो बार की बजाय यादृच्छिकता के 84 बिट देता है। प्रत्येक बिट आपके कुंजीपटल को दोगुना करता है, सैद्धांतिक खोज स्थान को बहुत छोटा बनाता है। 2E24 छोटे के कारक से।
आपका keyspace अभी भी 2E24 आकार में है, यहां तक कि हेक्स एन्कोडिंग के साथ है, तो मुझे लगता है कि यह एक सैद्धांतिक चिंता है। मैं आपके सिस्टम के खिलाफ क्रूर बल हमले करने वाले लोगों के बारे में चिंता नहीं करता।
संपादित:
पी.एस .: uuid.uuid4 समारोह यदि उपलब्ध libuuid उपयोग करता है। यह os.urandom (यदि उपलब्ध हो) से अन्यथा एंट्रॉपी प्राप्त करता है अन्यथा वर्तमान समय और स्थानीय ईथरनेट मैक पते से। यदि libuuid उपलब्ध नहीं है तो uuid.uuid4 फ़ंक्शन बाइट्स को os.urandom (अगर उपलब्ध हो) से सीधे प्राप्त करता है अन्यथा यह यादृच्छिक मॉड्यूल का उपयोग करता है। यादृच्छिक मॉड्यूल os.urandom (यदि उपलब्ध हो) के आधार पर डिफ़ॉल्ट बीज का उपयोग करता है अन्यथा वर्तमान समय के आधार पर एक मान। प्रत्येक फ़ंक्शन कॉल के लिए जांच होती है, इसलिए यदि आपके पास os.urandom नहीं है तो ओवरहेड अपेक्षा से थोड़ा बड़ा है।
लें घर संदेश? क्या आप जानते हैं आप os.urandom है तो आप
os.urandom(16).encode("base64")[:21]
कर सकता है, लेकिन अगर आप इसकी उपलब्धता के बारे में चिंता नहीं करना चाहते तो UUID मॉड्यूल का उपयोग करें।
आप SHA1 सोच किया जाना चाहिए। एमडी 5 32 हेक्साडेसिमल अंक है। – kmkaplan