diff --git a/Lib/uuid.py b/Lib/uuid.py --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -460,6 +460,26 @@ except: pass +_rng_pid = None, None +def _getrng(): + """Get random number generator""" + import random, os + global _rng_pid + + rng, pid = _rng_pid + curpid = os.getpid() + # force creating of new RNG after fork + if rng is not None and pid == curpid: + return rng + try: + rng = random.SystemRandom() + rng.random() + except Exception: + rng = random.Random() + _rng_pid = rng, curpid + return rng + + def _unixdll_getnode(): """Get the hardware address on Unix using ctypes.""" _buffer = ctypes.create_string_buffer(16) @@ -474,8 +494,8 @@ def _random_getnode(): """Get a random node ID, with eighth bit set as suggested by RFC 4122.""" - import random - return random.randrange(0, 1<<48) | 0x010000000000 + rng = _getrng() + return rng.randrange(0, 1 << 48) | 0x010000000000 _node = None @@ -531,8 +551,8 @@ timestamp = _last_timestamp + 1 _last_timestamp = timestamp if clock_seq is None: - import random - clock_seq = random.randrange(1<<14) # instead of stable storage + rng = _getrng() + clock_seq = rng.randrange(1 << 14) # instead of stable storage time_low = timestamp & 0xffffffff time_mid = (timestamp>> 32) & 0xffff time_hi_version = (timestamp>> 48) & 0x0fff @@ -563,8 +583,8 @@ import os return UUID(bytes=os.urandom(16), version=4) except: - import random - bytes = bytes_(random.randrange(256) for i in range(16)) + rng = _getrng() + bytes = bytes_(rng.randrange(256) for i in range(16)) return UUID(bytes=bytes, version=4) def uuid5(namespace, name):