annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5488
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
1 try:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
2 from secrets import choice, randbelow, token_bytes
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
3 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
4 pass
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
5
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
6 is_weak = False
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
7 except ImportError:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
8 import os as _os
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
9 import random as _random
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
10
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
11 # prefer to use SystemRandom if it is available
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
12 if hasattr(_random, 'SystemRandom'):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
13 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
14 pass
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
15
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
16 _r = _random.SystemRandom()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
17 is_weak = False
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
18 else:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
19 # don't completely throw away the existing state, but add some
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
20 # more random state to the existing state
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
21 def seed(v = None):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
22 import os, time
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
23 _r.seed((_r.getstate(),
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
24 v,
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
25 hasattr(os, 'getpid') and os.getpid(),
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
26 time.time()))
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
27
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
28 # create our own instance so we don't mess with the global
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
29 # random number generator
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
30 _r = _random.Random()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
31 seed()
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
32 is_weak = True
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
33
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
34 choice = _r.choice
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
35
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
36 def randbelow(i):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
37 return _r.randint(0, i - 1)
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
38
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
39 if hasattr(_os, 'urandom'):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
40 def token_bytes(l):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
41 return _os.urandom(l)
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
42 else:
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
43 def token_bytes(l):
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
44 _bchr = chr if str == bytes else lambda x: bytes((x,))
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff changeset
45 return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)])

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