13

Как создать GUID/UUID в Python

10

Как создать GUID/UUID в Python, который будет платформонезависимым? Я слышал, что на Windows существует метод, использующий ActivePython, но он специфичен для Windows, так как использует COM. Есть ли способ сделать это с помощью обычного Python?

5 ответ(ов)

0

Использую 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.

0

Если вам нужно передать UUID в качестве первичного ключа для вашей модели или уникального поля, вы можете использовать следующий код, который возвращает объект UUID:

import uuid
uuid.uuid4()

Если вы хотите передать UUID в качестве параметра для URL, вы можете использовать такой код:

import uuid
str(uuid.uuid4())

Если вам нужно получить шестнадцатеричное значение UUID, вы можете сделать следующее:

import uuid
uuid.uuid4().hex
0

Если вы разрабатываете веб-сайт или приложение, где вам нужно генерировать уникальные идентификаторы, то 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. Этот идентификатор можно использовать в вашей системе для обеспечения уникальности записей.

0

Вам нужно выполнить следующую команду:

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 различных версий с помощью этих библиотек.

0

Ответ 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. Но для моих нужд эта функция делает все, что нужно. Она осуществляет надежную валидацию и дает правильные результаты.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь