Bug report
Bug description:
According to the docs, uuid.getnode() is meant to return a number based on the MAC address of the network interface. However, if Python is built with libuuid, this does not match the observed behavior. Instead, getnode() often produces a random number.
Versions of Python obtained through python.org, brew, and pyenv don't appear to display this bug. But versions obtained through uv and python-build-standalone do.
The key difference seems to be which branch of this try block inside uuid.py is executed:
# Import optional C extension at toplevel, to help disabling it when testing
try:
import _uuid
_generate_time_safe = getattr(_uuid, "generate_time_safe", None)
_UuidCreate = getattr(_uuid, "UuidCreate", None)
_has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe
except ImportError:
_uuid = None
_generate_time_safe = None
_UuidCreate = None
_has_uuid_generate_time_safe = None
When the top branch executes, getnode() produces a random number.
When the bottom branch executes, getnode() produces a number tied to the MAC address of the network interface.
Steps to reproduce:
Case 1: working as intended
Using a version of Python compiled with these flags...
HAVE_UUID_CREATE = "0"
HAVE_UUID_ENC_BE = "0"
HAVE_UUID_GENERATE_TIME_SAFE = "1"
HAVE_UUID_H = "1"
HAVE_UUID_UUID_H = "1"
...we get this behavior:
$ python -c "import uuid; print(uuid.getnode())"
some number X
$ python -c "import uuid; print(uuid.getnode())"
the same number X
Case 2: buggy behavior
Using a version of Python compiled with these flags...
HAVE_UUID_CREATE = "0"
HAVE_UUID_ENC_BE = "0"
HAVE_UUID_GENERATE_TIME_SAFE = "0"
HAVE_UUID_H = "0"
HAVE_UUID_UUID_H = "1"
...we get this behavior:
$ python -c "import uuid; print(uuid.getnode())"
some number X
$ python -c "import uuid; print(uuid.getnode())"
some other number Y!!!
CPython versions tested on:
3.13
Operating systems tested on:
macOS, Linux
Linked PRs
Bug report
Bug description:
According to the docs, uuid.getnode() is meant to return a number based on the MAC address of the network interface. However, if Python is built with
libuuid, this does not match the observed behavior. Instead,getnode()often produces a random number.Versions of Python obtained through python.org,
brew, andpyenvdon't appear to display this bug. But versions obtained throughuvandpython-build-standalonedo.The key difference seems to be which branch of this
tryblock insideuuid.pyis executed:When the top branch executes,
getnode()produces a random number.When the bottom branch executes,
getnode()produces a number tied to the MAC address of the network interface.Steps to reproduce:
Case 1: working as intended
Using a version of Python compiled with these flags...
...we get this behavior:
Case 2: buggy behavior
Using a version of Python compiled with these flags...
...we get this behavior:
CPython versions tested on:
3.13
Operating systems tested on:
macOS, Linux
Linked PRs
_uuid.generate_time_safe()to deduce MAC address #132901_uuid.generate_time_safe()to deduce MAC address (GH-132901) #134697_uuid.generate_time_safe()to deduce MAC address (GH-132901) #134704 [to be merged in August 2025]_uuid.generate_time_safe()to deduce MAC address (GH-132901) #134704]