UUID означает Универсальный уникальный идентификатор. Это 128-битное значение, которое используется для идентификации информации в компьютерных системах.

В RFC 4122 определено пять версий UUID, но чаще всего используются версии uuid1 и uuid4.

Что такое UUID1 и UUID4?

uuid1 генерирует UUID на основе текущей временной метки системы и MAC-адреса компьютера, а uuid4 генерирует UUID с использованием случайных чисел.

Как сгенерировать uuid1 и uuid4 в коде Python?

import uuid

# Generate a UUID1 string
for i in range(3):
  uuid1_str = str(uuid.uuid1())
  print("UUID1 string:", uuid1_str)

# Generate a UUID4 string
for i in range(3):
  uuid4_str = str(uuid.uuid4())
  print("UUID4 string:", uuid4_str)

Вот результаты

UUID1 string: 6c271540-1bcf-11ee-b999-aa665a44b56e
UUID1 string: 6c27170c-1bcf-11ee-b999-aa665a44b56e
UUID1 string: 6c2717a2-1bcf-11ee-b999-aa665a44b56e


UUID4 string: 83ee0a78-7b53-4c46-9e01-5f7bebd6963f
UUID4 string: eb500027-b07b-4315-9b2c-030a09f520df
UUID4 string: 49a28f00-e59b-43d8-b14f-f9d3a8ee165a

Могу ли я изменить строку uuid1, чтобы получить исходную временную метку и MAC-адрес?

Да, вот код Python

import uuid
import datetime

def uuid_to_time_and_mac(uuid_string):
    uuid_obj = uuid.UUID(uuid_string)
    timestamp = (uuid_obj.time - 0x01b21dd213814000) * 100 / 1e9
    mac = uuid_obj.node.to_bytes(6, 'big')
    mac_str = ':'.join(['{:02x}'.format(b) for b in mac])
    time = datetime.datetime.fromtimestamp(timestamp)
    return time, mac_str


us = ['6c271540-1bcf-11ee-b999-aa665a44b56e',
      '6c27170c-1bcf-11ee-b999-aa665a44b56e',  
      '6c2717a2-1bcf-11ee-b999-aa665a44b56e']

for u in us:
  d = uuid_to_time_and_mac(u)
  print("Time is %s, MAC is %s" %(d[0],d[1]))

И результаты

Time is 2023-07-06 15:33:38.174496, MAC is aa:66:5a:44:b5:6e
Time is 2023-07-06 15:33:38.174542, MAC is aa:66:5a:44:b5:6e
Time is 2023-07-06 15:33:38.174557, MAC is aa:66:5a:44:b5:6e

Какова вероятность столкновения двух UUID1?

UUID1 генерируется на основе метки времени и MAC-адреса, поэтому существует вероятность коллизии при создании UUID1 на одном компьютере. В частности, если на одном компьютере сгенерированы два UUID1 с одинаковой отметкой времени и MAC-адресом, они будут конфликтовать.

Однако из-за использования временной метки в 100 наносекунд и 48-битного MAC-адреса вероятность коллизии очень мала. В частности, если UUID1 генерируются каждые 100 наносекунд на одном и том же компьютере, потребуется около 89 лет, чтобы вероятность столкновения достигла 50%.

Поэтому UUID1 обычно считается достаточно уникальным для большинства целей.