bpo-31784: Use time.time_ns() in uuid.uuid1() (GH-11189)
uuid.uuid1() now calls time.time_ns() rather than int(time.time() * 1e9). Replace also int(nanoseconds/100) with nanoseconds // 100. Add an unit test.
This commit is contained in:
parent
1dd035954b
commit
62a68b762a
|
@ -9,6 +9,7 @@ import pickle
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
py_uuid = support.import_fresh_module('uuid', blocked=['_uuid'])
|
py_uuid = support.import_fresh_module('uuid', blocked=['_uuid'])
|
||||||
c_uuid = support.import_fresh_module('uuid', fresh=['_uuid'])
|
c_uuid = support.import_fresh_module('uuid', fresh=['_uuid'])
|
||||||
|
@ -567,6 +568,23 @@ class BaseTestUUID:
|
||||||
u = self.uuid.uuid1()
|
u = self.uuid.uuid1()
|
||||||
self.assertEqual(u.is_safe, self.uuid.SafeUUID.unknown)
|
self.assertEqual(u.is_safe, self.uuid.SafeUUID.unknown)
|
||||||
|
|
||||||
|
def test_uuid1_time(self):
|
||||||
|
with mock.patch.object(self.uuid, '_has_uuid_generate_time_safe', False), \
|
||||||
|
mock.patch.object(self.uuid, '_generate_time_safe', None), \
|
||||||
|
mock.patch.object(self.uuid, '_last_timestamp', None), \
|
||||||
|
mock.patch.object(self.uuid, 'getnode', return_value=93328246233727), \
|
||||||
|
mock.patch('time.time_ns', return_value=1545052026752910643), \
|
||||||
|
mock.patch('random.getrandbits', return_value=5317): # guaranteed to be random
|
||||||
|
u = self.uuid.uuid1()
|
||||||
|
self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
|
||||||
|
|
||||||
|
with mock.patch.object(self.uuid, '_has_uuid_generate_time_safe', False), \
|
||||||
|
mock.patch.object(self.uuid, '_generate_time_safe', None), \
|
||||||
|
mock.patch.object(self.uuid, '_last_timestamp', None), \
|
||||||
|
mock.patch('time.time_ns', return_value=1545052026752910643):
|
||||||
|
u = self.uuid.uuid1(node=93328246233727, clock_seq=5317)
|
||||||
|
self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
|
||||||
|
|
||||||
def test_uuid3(self):
|
def test_uuid3(self):
|
||||||
equal = self.assertEqual
|
equal = self.assertEqual
|
||||||
|
|
||||||
|
|
|
@ -728,10 +728,10 @@ def uuid1(node=None, clock_seq=None):
|
||||||
|
|
||||||
global _last_timestamp
|
global _last_timestamp
|
||||||
import time
|
import time
|
||||||
nanoseconds = int(time.time() * 1e9)
|
nanoseconds = time.time_ns()
|
||||||
# 0x01b21dd213814000 is the number of 100-ns intervals between the
|
# 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.
|
# UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.
|
||||||
timestamp = int(nanoseconds/100) + 0x01b21dd213814000
|
timestamp = nanoseconds // 100 + 0x01b21dd213814000
|
||||||
if _last_timestamp is not None and timestamp <= _last_timestamp:
|
if _last_timestamp is not None and timestamp <= _last_timestamp:
|
||||||
timestamp = _last_timestamp + 1
|
timestamp = _last_timestamp + 1
|
||||||
_last_timestamp = timestamp
|
_last_timestamp = timestamp
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:func:`uuid.uuid1` now calls :func:`time.time_ns` rather than
|
||||||
|
``int(time.time() * 1e9)``.
|
Loading…
Reference in New Issue