Как создать GUID/UUID в Python
Как создать GUID/UUID в Python, который будет платформонезависимым? Я слышал, что на Windows существует метод, использующий ActivePython, но он специфичен для Windows, так как использует COM. Есть ли способ сделать это с помощью обычного Python?
5 ответ(ов)
Использую GUID в качестве случайных ключей для операций с базами данных.
Шестнадцатеричная форма с дефисами и лишними символами кажется мне слишком длинной. Однако мне нравится, что строки, представляющие шестнадцатеричные числа, очень безопасны, так как они не содержат символов, которые могут вызывать проблемы в некоторых ситуациях, таких как '+', '=', и т.д.
Вместо шестнадцатеричного представления я использую строку в формате base64, безопасном для URL. Обратите внимание, что приведенный ниже код не соответствует никакой спецификации UUID/GUID, кроме необходимости присутствия достаточного количества случайности.
import base64
import uuid
# Получить UUID - URL безопасный, Base64
def get_a_uuid():
r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
return r_uuid.replace('=', '')
Этот подход позволяет сократить длину строки и избежать проблем с символами, которые могут возникнуть при использовании стандартного формата GUID.
Если вам нужно передать UUID в качестве первичного ключа для вашей модели или уникального поля, вы можете использовать следующий код, который возвращает объект UUID:
import uuid
uuid.uuid4()
Если вы хотите передать UUID в качестве параметра для URL, вы можете использовать такой код:
import uuid
str(uuid.uuid4())
Если вам нужно получить шестнадцатеричное значение UUID, вы можете сделать следующее:
import uuid
uuid.uuid4().hex
Если вы разрабатываете веб-сайт или приложение, где вам нужно генерировать уникальные идентификаторы, то UUID (Universally Unique Identifier) — отличный выбор. Это полезный пакет в Python, который поможет создать уникальный ID.
Вы можете установить пакет с помощью следующей команды:
pip install uuid
Вот пример кода, который показывает, как создать уникальный идентификатор:
import uuid
def get_uuid_id():
return str(uuid.uuid4())
print(get_uuid_id())
На выходе вы получите что-то вроде этого: 89e5b891-cf2c-4396-8d1c-49be7f2ee02d
. Этот идентификатор можно использовать в вашей системе для обеспечения уникальности записей.
Вам нужно выполнить следующую команду:
pip install uuid uuid6
После этого вы сможете импортировать функции uuid1
, uuid3
, uuid4
и uuid5
из пакета uuid
, а также uuid6
и uuid7
из пакета uuid6
.
Пример вывода вызова каждой из этих функций (за исключением uuid3
и uuid5
, которые требуют параметров) будет выглядеть так:
>>> import uuid, uuid6
>>> print(*(str(i()) for i in [uuid.uuid1, uuid.uuid4, uuid6.uuid6, uuid6.uuid7]), sep="\n")
646e934b-f20c-11ec-ad9f-54a1500ef01b
560e2227-c738-41d9-ad5a-bbed6a3bc273
1ecf20b6-46e9-634b-9e48-b2b9e6010c57
01818aa2-ec45-74e8-1f85-9d74e4846897
Таким образом, вы сможете генерировать UUID различных версий с помощью этих библиотек.
Ответ 2019 года (для Windows):
Если вам нужен постоянный UUID, который уникально идентифицирует машину на Windows, вы можете использовать следующий способ: (С копией из моего ответа на https://stackoverflow.com/a/58416992/8874388).
from typing import Optional
import re
import subprocess
import uuid
def get_windows_uuid() -> Optional[uuid.UUID]:
try:
# Запрашиваем у Windows постоянный UUID устройства. Возникает исключение, если команда отсутствует/не выполняется.
txt = subprocess.check_output("wmic csproduct get uuid").decode()
# Пытаемся извлечь UUID из результата команды.
match = re.search(r"\bUUID\b[\s\r\n]+([^\s\r\n]+)", txt)
if match is not None:
txt = match.group(1)
if txt is not None:
# Удаляем лишние пробелы (новые строки, пробел и т.д.)
# и бесполезные тире и прочее, оставляя только шестнадцатеричные символы (0-9 A-F).
txt = re.sub(r"[^0-9A-Fa-f]+", "", txt)
# Убедимся, что у нас ровно 32 символа (16 байт).
if len(txt) == 32:
return uuid.UUID(txt)
except:
pass # Игнорируем исключение subprocess.
return None
print(get_windows_uuid())
Этот код использует API Windows для получения постоянного UUID компьютера, затем обрабатывает строку, чтобы убедиться, что это действительный UUID, и в конечном итоге возвращает объект Python (https://docs.python.org/3/library/uuid.html), который предоставляет удобные способы использовать данные (например, 128-битное целое число, шестнадцатеричную строку и т.д.).
Удачи!
P.S. Вызов subprocess, вероятно, можно заменить вызовом ctypes напрямую в ядре Windows/DLL. Но для моих нужд эта функция делает все, что нужно. Она осуществляет надежную валидацию и дает правильные результаты.
Как создать GUID / UUID?
Вызов функции модуля по его имени (строке)
Изменение типа столбца в pandas
Что такое __pycache__?
Как заполнить строку в Python пробелами?