I've been trying to find a more pythonic way of generating random string in python that can scale as well. Typically, I see something similar to
''.join(random.choice(string.letters) for i in xrange(len))
It sucks if you want to generate long string.
I've been thinking about random.getrandombits for a while, and figuring out how to convert that to an array of bits, then hex encode that. Using python 2.6 I came across the bitarray object, which isn't documented. Somehow I got it to work, and it seems really fast.
It generates a 50mil random string on my notebook in just about 3 seconds.
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]
edit
heikogerlach pointed out that it was an odd number of characters causing the issue. New code added to make sure it always sent fromhex an even number of hex digits.
Still curious if there's a better way of doing this that's just as fast.
and if you need url safe string :
(note random_string length is greatest than string_length in that case)
Regarding the last example, the following fix to make sure the line is even length, whatever the junk_len value:
It seems the
fromhex()
method expects an even number of hex digits. Your string is 75 characters long. Be aware thatsomething[:-1]
excludes the last element! Just usesomething[:]
.Sometimes a uuid is short enough and if you don't like the dashes you can always.replace('-', '') them
If you want it a specific length without dashes
Taken from the 1023290 bug report at Python.org:
Also, see the issues 923643 and 1023290