Whiz Tools

Генератор на UUID

Генериран UUID

Структура на UUID
Ниско време

Генератор на UUID

Въведение

Универсалният уникален идентификатор (UUID) е 128-битов номер, използван за идентифициране на информация в компютърни системи. UUID-ите са стандартизирани от Open Software Foundation (OSF) като част от Distributed Computing Environment (DCE). Тези идентификатори са проектирани да бъдат уникални както в пространството, така и във времето, което ги прави идеални за различни приложения в разпределени системи и извън тях.

Този инструмент за генериране на UUID позволява създаването както на версия 1 (основана на време), така и на версия 4 (случайна) UUID. Тези идентификатори са полезни в различни сценарии, където е необходимо уникално идентифициране, като ключове в бази данни, разпределени системи и мрежови протоколи.

Как работят UUID-ите

Структура на UUID

UUID обикновено се представя като 32 шестнадесетични цифри, показани в пет групи, разделени с тирета, във формата 8-4-4-4-12 за общо 36 символа (32 алфанумерични символа и 4 тирета). Например:

550e8400-e29b-41d4-a716-446655440000

128-те бита на UUID са разделени на специфични полета, всяко от които носи различна информация в зависимост от версията на UUID:

  • 32 бита за полето time_low
  • 16 бита за полето time_mid
  • 16 бита за полето time_hi_and_version
  • 8 бита за полето clock_seq_hi_and_reserved
  • 8 бита за полето clock_seq_low
  • 48 бита за полето node

Ето диаграма, илюстрираща структурата на UUID:

A B C D E F A: time_low (32 бита) B: time_mid (16 бита) C: time_hi_and_version (16 бита) D: clock_seq_hi_and_reserved (8 бита) E: clock_seq_low (8 бита) F: node (48 бита)

Версии на UUID

Съществуват няколко версии на UUID, всяка с различен метод на генериране:

  1. Версия 1 (основана на време): Използва текущата времева отметка и MAC адреса на компютъра.
  2. Версия 2 (DCE Security): Подобна на версия 1, но включва локален домейн идентификатор.
  3. Версия 3 (основана на име, MD5): Генерира се чрез хеширане на идентификатор на пространство и име.
  4. Версия 4 (случайна): Генерира се с помощта на случайно или псевдослучайно число.
  5. Версия 5 (основана на име, SHA-1): Подобна на версия 3, но използва SHA-1 хеширане.

Този инструмент се фокусира върху генерирането на версия 1 и версия 4 UUID.

Формула

Генериране на UUID версия 1

UUID-ите версия 1 се генерират с помощта на следните компоненти:

  1. Времева отметка: 60-битова стойност, представляваща броя на 100-наносекундни интервали от 15 октомври 1582 г. (датата на реформата на Григорианския календар).
  2. Последователност на часовника: 14-битова стойност, използвана за избягване на дубликати в случай, че часовникът бъде настроен назад.
  3. Възел: 48-битова стойност, обикновено извлечена от MAC адреса на компютъра.

Формулата за генериране на UUID версия 1 може да бъде изразена като:

UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node

Генериране на UUID версия 4

UUID-ите версия 4 се генерират с помощта на криптографски силен генератор на случайни числа. Формулата е просто:

UUID = random_128_bit_number

С конкретни битове, зададени за индикация на версията (4) и варианта.

Приложения

UUID-ите имат многобройни приложения в различни области на компютърните науки и софтуерното инженерство:

  1. Ключове в бази данни: UUID-ите често се използват като основни ключове в бази данни, особено в разпределени системи, където множество възли могат да генерират записи едновременно.

  2. Разпределени системи: В големи разпределени системи UUID-ите помагат в уникалното идентифициране на ресурси, транзакции или събития в множество възли или центрове за данни.

  3. Адресиране на съдържание: UUID-ите могат да се използват за създаване на уникални идентификатори за съдържание в системи за адресируемо съдържание.

  4. Управление на сесии: Уеб приложенията често използват UUID-ите за управление на потребителските сесии, осигурявайки уникален идентификатор за всяка сесия.

  5. Идентификация на устройства IoT: В приложенията на Интернет на нещата (IoT) UUID-ите могат да се използват за уникално идентифициране на отделни устройства в мрежа.

Алтернативи

Въпреки че UUID-ите са широко използвани, съществуват алтернативни подходи за генериране на уникални идентификатори:

  1. Автоинкрементиращи ID: Прости и обикновено използвани в системи с единична база данни, но не са подходящи за разпределени среди.

  2. ID на базата на времева отметка: Могат да бъдат полезни за данни, подредени по време, но могат да срещнат проблеми с колизията в сценарии с висока конкуренция.

  3. Snowflake ID: Разработени от Twitter, тези ID комбинират времева отметка и номер на работника, за да генерират уникални ID в разпределени системи.

  4. ULID (Универсално уникално лексикографски подредено идентификатор): По-нов алтернативен вариант, който цели да бъде по-човешки приятелски и подреден от UUID-ите.

История

Концепцията за UUID-ите беше първоначално представена в системата за мрежово компютри на Apollo и по-късно стандартизирана от Open Software Foundation (OSF) като част от Distributed Computing Environment (DCE) през 90-те години. Първата спецификация беше публикувана през 1997 г. като ISO/IEC 11578:1996 и по-късно преразгледана през 2005 г. като част от ISO/IEC 9834-8:2005.

Ключови етапи в историята на UUID:

  • 1980-те: Apollo Computer разработва концепцията за UUID за своята система за мрежово компютри.
  • 1997: Публикувана е първата спецификация на UUID като ISO/IEC 11578:1996.
  • 2005: Спецификацията на UUID е преразгледана и публикувана като част от ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 определя формата на UUID и алгоритмите за генериране, използвани днес.

С времето UUID-ите станаха основен инструмент в разпределените системи и проектирането на бази данни, с различни реализации и адаптации в различни програмни езици и платформи.

Примери за код

Ето примери за генериране на UUID в различни програмни езици:

import uuid

## Генериране на UUID версия 4 (случайна)
random_uuid = uuid.uuid4()
print(f"UUID версия 4: {random_uuid}")

## Генериране на UUID версия 1 (основана на време)
time_based_uuid = uuid.uuid1()
print(f"UUID версия 1: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Генериране на UUID версия 4 (случайна)
const randomUuid = uuidv4();
console.log(`UUID версия 4: ${randomUuid}`);

// Генериране на UUID версия 1 (основана на време)
const timeBasedUuid = uuidv1();
console.log(`UUID версия 1: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Генериране на UUID версия 4 (случайна)
        UUID randomUuid = UUID.randomUUID();
        System.out.println("UUID версия 4: " + randomUuid);

        // Генериране на UUID версия 1 (основана на време)
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("UUID версия 1: " + timeBasedUuid);
    }
}
require 'securerandom'

## Генериране на UUID версия 4 (случайна)
random_uuid = SecureRandom.uuid
puts "UUID версия 4: #{random_uuid}"

## Ruby няма вградена функция за UUID версия 1
## Трябва да използвате библиотека като 'uuidtools' за това
<?php
// Генериране на UUID версия 4 (случайна)
$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
echo "UUID версия 4: " . $randomUuid . "\n";

// PHP няма вградена функция за UUID версия 1
// Трябва да използвате библиотека като 'ramsey/uuid' за това
?>

Източници

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. International Organization for Standardization. (2005). Information technology – Open Systems Interconnection – Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Universally unique identifier. (2023). In Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. Snowflake ID. (2023). In Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. ULID Spec. (н.д.). GitHub. https://github.com/ulid/spec
Feedback