diff options
Diffstat (limited to 'Lib/uuid.py')
| -rw-r--r-- | Lib/uuid.py | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/Lib/uuid.py b/Lib/uuid.py index ae3da25..259f1bb 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -393,7 +393,6 @@ def _netbios_getnode(): _uuid_generate_random = _uuid_generate_time = _UuidCreate = None try: import ctypes, ctypes.util - _buffer = ctypes.create_string_buffer(16) # The uuid_generate_* routines are provided by libuuid on at least # Linux and FreeBSD, and provided by libc on Mac OS X. @@ -407,6 +406,19 @@ try: if hasattr(lib, 'uuid_generate_time'): _uuid_generate_time = lib.uuid_generate_time + # The uuid_generate_* functions are broken on MacOS X 10.5, as noted + # in issue #8621 the function generates the same sequence of values + # in the parent process and all children created using fork (unless + # those children use exec as well). + # + # Assume that the uuid_generate functions are broken from 10.5 onward, + # the test can be adjusted when a later version is fixed. + import sys + if sys.platform == 'darwin': + import os + if int(os.uname()[2].split('.')[0]) >= 9: + _uuid_generate_random = _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 # random UUID and UuidCreateSequential gives a UUID containing the @@ -426,11 +438,13 @@ except: def _unixdll_getnode(): """Get the hardware address on Unix using ctypes.""" + _buffer = ctypes.create_string_buffer(16) _uuid_generate_time(_buffer) return UUID(bytes=_buffer.raw).node def _windll_getnode(): """Get the hardware address on Windows using ctypes.""" + _buffer = ctypes.create_string_buffer(16) if _UuidCreate(_buffer) == 0: return UUID(bytes=_buffer.raw).node @@ -479,6 +493,7 @@ def uuid1(node=None, clock_seq=None): # When the system provides a version-1 UUID generator, use it (but don't # use UuidCreate here because its UUIDs don't conform to RFC 4122). if _uuid_generate_time and node is clock_seq is None: + _buffer = ctypes.create_string_buffer(16) _uuid_generate_time(_buffer) return UUID(bytes=_buffer.raw) @@ -487,8 +502,8 @@ def uuid1(node=None, clock_seq=None): nanoseconds = int(time.time() * 1e9) # 0x01b21dd213814000 is the number of 100-ns intervals between the # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00. - timestamp = int(nanoseconds/100) + 0x01b21dd213814000L - if timestamp <= _last_timestamp: + timestamp = int(nanoseconds//100) + 0x01b21dd213814000L + if _last_timestamp is not None and timestamp <= _last_timestamp: timestamp = _last_timestamp + 1 _last_timestamp = timestamp if clock_seq is None: @@ -506,8 +521,8 @@ def uuid1(node=None, clock_seq=None): def uuid3(namespace, name): """Generate a UUID from the MD5 hash of a namespace UUID and a name.""" - import md5 - hash = md5.md5(namespace.bytes + name).digest() + from hashlib import md5 + hash = md5(namespace.bytes + name).digest() return UUID(bytes=hash[:16], version=3) def uuid4(): @@ -515,6 +530,7 @@ def uuid4(): # 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=_buffer.raw) @@ -529,8 +545,8 @@ def uuid4(): def uuid5(namespace, name): """Generate a UUID from the SHA-1 hash of a namespace UUID and a name.""" - import sha - hash = sha.sha(namespace.bytes + name).digest() + from hashlib import sha1 + hash = sha1(namespace.bytes + name).digest() return UUID(bytes=hash[:16], version=5) # The following standard UUIDs are for use with uuid3() or uuid5(). |
