Я намагався знайти більш пітонічний спосіб генерації випадкового рядка в python, який також може масштабуватися. Як правило, я бачу щось подібне до
''.join(random.choice(string.letters) for i in xrange(len))
Це відмовно, якщо ви хочете створити довгий рядок.
Я деякий час думав про random.getrandombits і з'ясував, як перетворити це на масив бітів, а потім шістнадцяткове кодування. Використовуючи python 2.6, я натрапив на об’єкт bitarray, який не задокументований. Якось я змусив це працювати, і це здається дуже швидко.
Він генерує 50-міліметровий випадковий рядок на моєму ноутбуці приблизно за 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 зазначив, що причиною проблеми стала непарна кількість символів. Новий код додано, щоб переконатися, що він завжди надсилав із шістнадцяткового числа парну кількість шістнадцяткових цифр.
Досі цікаво, чи є кращий спосіб зробити це так само швидко.