2009-04-24 12 views
77

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

''.join(random.choice(string.letters) for i in xrange(len)) 

ऐसा लगता है कि यदि आप लंबी स्ट्रिंग उत्पन्न करना चाहते हैं तो यह बेकार है।

मैं थोड़ी देर के लिए random.getrandombits के बारे में सोच रहा हूं, और यह पता लगा रहा हूं कि बिट्स की एक सरणी में इसे कैसे परिवर्तित किया जाए, फिर हेक्स एन्कोड करें। पायथन 2.6 का उपयोग करके मैं बिटरैरे ऑब्जेक्ट में आया, जिसे दस्तावेज नहीं किया गया है। किसी भी तरह से मुझे यह काम करने के लिए मिला, और यह वास्तव में तेज़ लगता है।

यह लगभग 3 सेकंड में मेरी नोटबुक पर 50 मिलीलीटर यादृच्छिक स्ट्रिंग उत्पन्न करता है।

def rand1(leng): 
    nbits = leng * 6 + 1 
    bits = random.getrandbits(nbits) 
    uc = u"%0x" % bits 
    newlen = int(len(uc)/2) * 2 # we have to make the string an even length 
    ba = bytearray.fromhex(uc[:newlen]) 
    return base64.urlsafe_b64encode(str(ba))[:leng] 

संपादित

heikogerlach ने बताया कि यह समस्या पैदा कर पात्रों में से एक विषम संख्या थी। यह सुनिश्चित करने के लिए नया कोड जोड़ा गया है कि यह हमेशा हेक्स अंकों की संख्या को भी भेजता है।

अभी भी उत्सुक है कि ऐसा करने का एक बेहतर तरीका है जितना तेज़ है।

+1

बिना एक विशिष्ट लंबाई चाहते हैं मैं इस कर सकता हूँ कैसे इतना है कि यह शामिल केवल करेंगे, तो संख्या, अक्षर और रेखांकित? (इसमें एक डैश शामिल है) – wenbert

+2

@ वेनबर्ट '। जॉइन (random.choice (string.letters + string.digits + "_") xrange (लंबाई) में मैं – yanjost

उत्तर

132
import os 
random_string = os.urandom(string_length) 

और आप URL सुरक्षित स्ट्रिंग की जरूरत है:

import os 
random_string = os.urandom(string_length).hex() 

+0

आह! बहुत आसन। मुझे नहीं लगता था कि यह क्रॉस-प्लेटफार्म था, लेकिन स्पष्ट रूप से यह है। – mikelikespie

+0

बस एक फॉलोअप, यह वास्तव में अजीब है, लेकिन कम से कम ओएस एक्स पर, getrandbits विधि 2-3x तेज है। – mikelikespie

+9

शायद यह इसलिए है क्योंकि ओएस।यूरैंडम एक क्रिप्टोग्राफिक रूप से सुरक्षित पीआरएनजी (आमतौर पर एक स्ट्रीम सिफर) होगा जबकि यादृच्छिक एक "सामान्य" पीआरएनजी है जो आमतौर पर गणना करने के लिए तेज़ी से होता है। – Joey

2

(टिप्पणी random_string लंबाई उस मामले में STRING_LENGTH से सबसे बड़ी है) ऐसा लगता है fromhex() विधि हेक्स अंक की समान संख्या की उम्मीद । आपकी स्ट्रिंग 75 वर्ण लंबी है। ध्यान रखें कि something[:-1]अंतिम तत्व को छोड़ देता है! बस something[:] का उपयोग करें।

+0

__hex __() के साथ एक पिछला एल था। मैं नमूना कोड फिर से लिखता हूं। वैसे भी, मुझे लगता है कि आप हेक्स एन्कोडिंग की याद दिलाने के लिए – mikelikespie

5

Python.org पर 1023290 बग रिपोर्ट से लिया:

junk_len = 1024 
junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 
8)).decode("hex") 

इसके अलावा, मुद्दों 923643 और 1023290

+0

+1 की संख्या की आवश्यकता के साथ सही थे। – Buttons840

2

पिछले उदाहरण के संबंध में दिखाई देता है, के लिए निम्न ठीक यकीन है कि लाइन भी लंबाई है , जो कुछ भी junk_len मूल्य:

junk_len = 1024 
junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex") 
9

कभी कभी एक UUID काफी कम है और अगर आप डैश पसंद नहीं है आप कर सकते हैं ALW ays.replace ('-', '') उन्हें

from uuid import uuid4 

random_string = str(uuid4()) 

आप इसे डैश

random_string_length = 16 
str(uuid4()).replace('-', '')[:random_string_length] 
+0

या हाइफ़ेंस के बिना मूल्य प्राप्त करने के लिए 'uuid4()। हेक्स' का उपयोग करें – davoclavo

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