diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/roundup/anypy/random_.py	Sat Aug 04 22:40:16 2018 +0100
@@ -0,0 +1,45 @@
+try:
+    from secrets import choice, randbelow, token_bytes
+    def seed(v = None):
+        pass
+
+    is_weak = False
+except ImportError:
+    import os as _os
+    import random as _random
+
+    # prefer to use SystemRandom if it is available
+    if hasattr(_random, 'SystemRandom'):
+        def seed(v = None):
+            pass
+
+        _r = _random.SystemRandom()
+        is_weak = False
+    else:
+        # don't completely throw away the existing state, but add some
+        # more random state to the existing state
+        def seed(v = None):
+            import os, time
+            _r.seed((_r.getstate(),
+                     v,
+                     hasattr(os, 'getpid') and os.getpid(),
+                     time.time()))
+
+        # create our own instance so we don't mess with the global
+        # random number generator
+        _r = _random.Random()
+        seed()
+        is_weak = True
+
+    choice = _r.choice
+
+    def randbelow(i):
+        return _r.randint(0, i - 1)
+
+    if hasattr(_os, 'urandom'):
+        def token_bytes(l):
+            return _os.urandom(l)
+    else:
+        def token_bytes(l):
+            _bchr = chr if str == bytes else lambda x: bytes((x,))
+            return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)])

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