سؤال

لقد كنت أحاول إيجاد طريقة أكثر ثباتا لتوليد سلسلة عشوائية في بيثون التي يمكن أن الحجم أيضا. عادة، أرى شيئا مشابها

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

تمتص إذا كنت ترغب في توليد سلسلة طويلة.

لقد كنت أفكر في عشوائي. gettrandombits لفترة من الوقت، وأفترض كيفية تحويل ذلك إلى مجموعة من البتات، ثم ترميز هيكس ذلك. باستخدام Python 2.6 جئت عبر كائن Bitarray، الذي لم يتم توثيقه. بطريقة ما حصلت عليه للعمل، ويبدو أن سريع حقا.

يقوم بإنشاء سلسلة عشوائية 50mil على دفتر ملاحظاتي في حوالي 3 ثوان فقط.

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 إلى أنه كان عدد فرديا من الشخصيات التي تسبب المشكلة. إضافة رمز جديد للتأكد من إرسالها دائما من عدد من أرقام سداسي عشرية.

لا يزال فضوليا إذا كان هناك طريقة أفضل للقيام بذلك بأسرع وقت.

هل كانت مفيدة؟

المحلول

import os
random_string = os.urandom(string_length)

وإذا كنت بحاجة إلى سلسلة آمنة URL:

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

(ملاحظة الطول العشوائي هو أعظم من string_length في هذه الحالة)

نصائح أخرى

في بعض الأحيان يكون UUID قصير بما فيه الكفاية وإذا كنت لا تحب الشرط، فيمكنك دائما. ضع ('-'، '') لهم

from uuid import uuid4

random_string = str(uuid4())

إذا كنت تريد ذلك بطول معين دون شرطات

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

مأخوذة من 1023290 تقرير الأخطاء في Python.org:

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

أيضا، انظر القضايا 923643 و 1023290

يبدو أن fromhex() الطريقة تتوقع عددا حتى عدد من أرقام السدس. سلسلة الخاص بك هي 75 حرفا. كن حذرا ان something[:-1] يستبعد العنصر الأخير! مجرد استخدام something[:].

فيما يتعلق بالمثال الأخير، والإصلاح التالي للتأكد من أن السطر هو طوله، مهما كانت القيمة Junk_len:

junk_len = 1024
junk =  (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top