comparison roundup/anypy/random_.py @ 5488:52cb53eedf77

reworked random number use prefer secrets module from Python 3.6+, random.SystemRandom and finally plain random
author Christof Meerwald <cmeerw@cmeerw.org>
date Sat, 04 Aug 2018 22:40:16 +0100
parents
children adf54478cdaf
comparison
equal deleted inserted replaced
5487:ce171c81d823 5488:52cb53eedf77
1 try:
2 from secrets import choice, randbelow, token_bytes
3 def seed(v = None):
4 pass
5
6 is_weak = False
7 except ImportError:
8 import os as _os
9 import random as _random
10
11 # prefer to use SystemRandom if it is available
12 if hasattr(_random, 'SystemRandom'):
13 def seed(v = None):
14 pass
15
16 _r = _random.SystemRandom()
17 is_weak = False
18 else:
19 # don't completely throw away the existing state, but add some
20 # more random state to the existing state
21 def seed(v = None):
22 import os, time
23 _r.seed((_r.getstate(),
24 v,
25 hasattr(os, 'getpid') and os.getpid(),
26 time.time()))
27
28 # create our own instance so we don't mess with the global
29 # random number generator
30 _r = _random.Random()
31 seed()
32 is_weak = True
33
34 choice = _r.choice
35
36 def randbelow(i):
37 return _r.randint(0, i - 1)
38
39 if hasattr(_os, 'urandom'):
40 def token_bytes(l):
41 return _os.urandom(l)
42 else:
43 def token_bytes(l):
44 _bchr = chr if str == bytes else lambda x: bytes((x,))
45 return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)])

Roundup Issue Tracker: http://roundup-tracker.org/