always use os.urandom for the uuid4 algorithm (closes #25515)
This commit is contained in:
parent
265cee0480
commit
788cb52905
26
Lib/uuid.py
26
Lib/uuid.py
|
@ -44,6 +44,8 @@ Typical usage:
|
|||
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
__author__ = 'Ka-Ping Yee <ping@zesty.ca>'
|
||||
|
||||
RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [
|
||||
|
@ -456,7 +458,7 @@ def _netbios_getnode():
|
|||
|
||||
# If ctypes is available, use it to find system routines for UUID generation.
|
||||
# XXX This makes the module non-thread-safe!
|
||||
_uuid_generate_random = _uuid_generate_time = _UuidCreate = None
|
||||
_uuid_generate_time = _UuidCreate = None
|
||||
try:
|
||||
import ctypes, ctypes.util
|
||||
import sys
|
||||
|
@ -471,12 +473,9 @@ try:
|
|||
lib = ctypes.CDLL(ctypes.util.find_library(libname))
|
||||
except Exception:
|
||||
continue
|
||||
if hasattr(lib, 'uuid_generate_random'):
|
||||
_uuid_generate_random = lib.uuid_generate_random
|
||||
if hasattr(lib, 'uuid_generate_time'):
|
||||
_uuid_generate_time = lib.uuid_generate_time
|
||||
if _uuid_generate_random is not None:
|
||||
break # found everything we were looking for
|
||||
break
|
||||
del _libnames
|
||||
|
||||
# The uuid_generate_* functions are broken on MacOS X 10.5, as noted
|
||||
|
@ -489,7 +488,7 @@ try:
|
|||
if sys.platform == 'darwin':
|
||||
import os
|
||||
if int(os.uname().release.split('.')[0]) >= 9:
|
||||
_uuid_generate_random = _uuid_generate_time = None
|
||||
_uuid_generate_time = None
|
||||
|
||||
# On Windows prior to 2000, UuidCreate gives a UUID containing the
|
||||
# hardware address. On Windows 2000 and later, UuidCreate makes a
|
||||
|
@ -600,20 +599,7 @@ def uuid3(namespace, name):
|
|||
|
||||
def uuid4():
|
||||
"""Generate a random UUID."""
|
||||
|
||||
# When the system provides a version-4 UUID generator, use it.
|
||||
if _uuid_generate_random:
|
||||
_buffer = ctypes.create_string_buffer(16)
|
||||
_uuid_generate_random(_buffer)
|
||||
return UUID(bytes=bytes_(_buffer.raw))
|
||||
|
||||
# Otherwise, get randomness from urandom or the 'random' module.
|
||||
try:
|
||||
import os
|
||||
return UUID(bytes=os.urandom(16), version=4)
|
||||
except Exception:
|
||||
import random
|
||||
return UUID(int=random.getrandbits(128), version=4)
|
||||
return UUID(bytes=os.urandom(16), version=4)
|
||||
|
||||
def uuid5(namespace, name):
|
||||
"""Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""
|
||||
|
|
|
@ -48,6 +48,8 @@ Library
|
|||
- Issue #25503: Fixed inspect.getdoc() for inherited docstrings of properties.
|
||||
Original patch by John Mark Vandenberg.
|
||||
|
||||
- Issue #25515: Always use os.urandom as a source of randomness in uuid.uuid4.
|
||||
|
||||
- Issue #21827: Fixed textwrap.dedent() for the case when largest common
|
||||
whitespace is a substring of smallest leading whitespace.
|
||||
Based on patch by Robert Li.
|
||||
|
|
Loading…
Reference in New Issue