UUID Генератор - Креирајте единствени идентификатори
Што е UUID?
UUID (Универзален Уникатен Идентификатор) е 128-битен идентификатор што се користи во компјутерските системи за единствена идентификација на информации. UUID е стандардизиран според RFC 4122 и, благодарение на неговата огромна ентропија, гарантира практично нулта веројатност за судир – што значи дека два независно генерирани UUID речиси сигурно ќе бидат уникатни.
UUID има стандарден формат: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, каде што секој x е хексадецимална цифра (0-9, a-f), M ја означува верзијата на UUID, а N ја означува варијантата.
UUID верзии
UUID v1 (Временски печат + MAC адреса)
UUID v1 се базира на тековниот временски печат (timestamp) и случајна вредност (во прелистувачот наместо MAC адреса). Користи 100-наносекундни интервали од 15 октомври 1582 година (Грегоријански календар).
Употреба:
- Ситуации кога ви е потребно хронолошко подредување на UUID
- Дебагирање и евидентирање (UUID содржи информации за времето на креирање)
- Дистрибуирани системи со временска синхронизација
Пример: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Предности:
- UUID може да се подредат хронолошки според времето на креирање
- Корисно за ревизија и дебагирање
- Содржи информации за временскиот печат
Недостатоци:
- Потенцијален безбедносен ризик – содржи временски печат
- Во прелистувачот не содржи вистинска MAC адреса (заменета со случајна вредност)
- Лоша DB локација (временскиот печат е во бит со низок ред)
UUID v3 (MD5 хеш)
UUID v3 се генерира со помош на MD5 хеш од UUID именскиот простор и името. Детерминистичко – истиот именски простор + име секогаш ќе креираат ист UUID.
Употреба:
- Конверзија на URL, DNS имиња или други идентификатори во UUID
- Ситуации кога ви е потребен репродуктивен UUID
- Мапирање помеѓу различни системи за идентификација
Пример: a3bb189e-8bf9-3888-9912-ace4e6543002
Предности:
- Детерминистичко (ист влез = ист излез)
- Идеално за конверзии на познати идентификатори
- Без судир за различни влезови
Недостатоци:
- MD5 е застарен алгоритам (преферирајте v5)
- Бара именски простор и име
- Не може да се добие назад оригиналниот влез
UUID v4 (Случајно) - ПРЕПОРАЧАНО
Најкористената верзија на UUID. UUID v4 се генерира чисто случајно со помош на криптографски безбеден генератор на случајни броеви (crypto.getRandomValues()).
Употреба:
- Примарни клучеви на база на податоци
- Идентификатори на сесии (session IDs)
- Уникатни имиња на датотеки
- API токени
- Општи цели, каде што ви е потребен загарантирано уникатен ID
Пример: f47ac10b-58cc-4372-a567-0e02b2c3d479
Предности:
- Максимална ентропија и безбедност
- Без зависност од време или системски параметри
- Наједноставна имплементација
Веројатност за судир: При генерирање 1 милијарда UUID во секунда во текот на 100 години, шансата за судир е приближно 0,00000006%.
UUID v5 (SHA-1 хеш)
UUID v5 е исто како v3, но користи SHA-1 наместо MD5. Помодерна и побезбедна алтернатива на v3.
Употреба:
- Исто како v3, но со подобра безбедност
- Преферирано пред v3 за нови проекти
- Генерирање UUID од URL, DNS имиња, OID, X.500 DN
Пример: 886313e1-3b8a-5372-9b90-0c9aee199e5d
Предности:
- Детерминистичко
- SHA-1 е поцврст од MD5
- Погодно за мапирање помеѓу системи
Недостатоци:
- SHA-1 исто така се смета за застарен (но сепак побезбеден од MD5)
- Бара именски простор и име
UUID v6 (Подреден временски печат)
UUID v6 е подобрена верзија на v1 со преуредени временски битови за подобро индексирање во DB. Дизајнирано за решавање проблеми со локалитет во базите на податоци.
Употреба:
- Примарни клучеви на база на податоци со временско подредување
- Системи кои бараат хронолошко подредување и перформанси на DB
- Помодерна алтернатива на v1
Пример: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
Предности:
- Подобра DB локација од v1 (временскиот печат е во бит со висок ред)
- Хронолошко подредување
- Компатибилен со UUID стандардот
Недостатоци:
- Помалку користен од v1/v4
- Сè уште содржи временски информации (безбедносен ризик)
UUID v7 (Unix временски печат)
UUID v7 користи Unix временски печат (милисекунди од 1970) + случајни битови. Најновата верзија на UUID со најдобра DB локација.
Употреба:
- Модерни примарни клучеви на база на податоци
- Системи кои бараат перформанси + временско подредување
- Замена за v1/v6 во нови проекти
Пример: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
Предности:
- Најдобра DB локација од сите верзии
- Unix временскиот печат е стандарден
- Комбинира предности на случајност и временско подредување
Недостатоци:
- Релативно нова спецификација (RFC 4122bis)
- Помалку поддржана во старите системи
Која UUID верзија да се користи?
Водич за одлучување
Дали ви е потребна максимална безбедност и случајност? → Користете UUID v4 (најчест избор)
Дали ви треба временско подредување и перформанси на DB? → Користете UUID v7 (модерно) или UUID v6 (стандардно)
Дали ви е потребен репродуктивен UUID од постоечки идентификатори? → Користете UUID v5 (SHA-1) или UUID v3 (MD5, наследно)
Дали ви е потребен временски печат и трага од ревизија? → Користете UUID v1 (наследно, полоши перформанси на DB)
Бази на податоци
За нови проекти: UUID v7 или v4
- v7 е идеален за временско подредување + перформанси
- v4 за максимална случајност без временски информации
За наследни системи: UUID v1 или v6
- v6 има подобра DB локација од v1
- v1 е широко поддржан
Предности на UUID како примарен клуч:
- Глобална уникатност – Можете да поврзете податоци од различни бази на податоци без конфликт
- Безбедност – За разлика од секвенцијалните ID (1, 2, 3…), не може да се предвидат следните вредности
- Дистрибуирани системи – UUID може да се генерираат независно на повеќе сервери без координација
- Спојување бази на податоци – При спојување на две бази на податоци не настануваат конфликти
Недостатоци:
- Поголема големина (16 бајти наспроти 4-8 бајти за цел број)
- Побавно индексирање во некои бази на податоци (користете v6/v7 за подобри перформанси)
- Помалку читливо за човек
API и веб услуги
- REST API – Уникатни идентификатори за ресурси
- GraphQL – Глобални идентификатори за јазли
- Webhook-и – Следење барања и одговори
- Токени – ID на сесии, токени за освежување
Датотеки и складирање
- Имиња на датотеки – Спречување судири при прикачување
- S3/Складирање во облак – Уникатни патеки до објекти
- Клучеви за кеш – Идентификатори во кеш системи
Фронтенд апликации
- React/Vue компоненти – Уникатни клучеви за листи
- Привремени ID-и – ID пред зачувување во база на податоци
- Локално складирање – Клучеви за зачувани податоци
- Offline-first апликации – Генерирање ID без поврзување со сервер
Напредни функции на генераторот
Генерирање UUID со сопствено време
За верзии базирани на време (v1, v6, v7) можете да изберете произволен временски печат користејќи го бирачот за датум и време. Ова е корисно за:
Тестирање:
- Симулација на UUID креирани во минатото
- Тестирање на временско подредување во бази на податоци
- Репродукција на UUID за дебагирање
Миграција на податоци:
- Генерирање UUID со историски временски печати
- Пополнување податоци со коректни вредности на временскиот печат
- Увоз на податоци од различни временски периоди
Ревизија и усогласеност:
- Реконструкција на UUID според времето на креирање на записот
- Ретроактивно генерирање идентификатори
Пример за употреба:
- Изберете верзија v1, v6 или v7
- Поставете датум и време користејќи го бирачот за датум и време
- Генерирајте UUID со ваш сопствен временски печат
UUID базирани на хеш (v3, v5)
За детерминистички UUID можете да користите верзии v3 (MD5) или v5 (SHA-1):
Како да се користи:
- Изберете именски простор според типот на вашиот идентификатор
- Внесете име/вредност
- Генерирајте UUID
Примери:
| Именски простор | Име (влез) | Употреба |
|---|---|---|
| DNS | example.com | Конверзија на име на домен во UUID |
| DNS | google.com | Секоја веб-страница има уникатен UUID |
| URL | https://example.com/page | Конверзија на URL во UUID |
| URL | https://api.example.com/users/123 | API крајна точка како UUID |
| OID | 1.3.6.1.4.1.343 | Идентификатор на објект во UUID |
| X.500 | CN=John Doe,O=Company | Distinguished Name во UUID |
Важни својства:
- ✅ Детерминистичко: Ист влез = секогаш ист UUID
- ✅ Репродуктивно: Можете да го креирате UUID повторно во секое време
- ✅ Конзистентно: Ист UUID низ различни системи
- ❌ Не може да се декодира: Од UUID не може да се добие назад оригиналното име
- ℹ️ Еден UUID: За v3/v5 се генерира секогаш само еден UUID (ист влез = ист излез)
Практична употреба:
// Пример: Конверзија на URL во UUID v5
Namespace: URL
Име: https://example.com/api/users/123
Резултат: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// Ист влез = секогаш ист UUID
Namespace: DNS
Име: google.com
Резултат: секогаш ист UUID за google.com
Како безбедно да се користи UUID?
Криптографска безбедност
Нашиот генератор користи crypto.getRandomValues(), што е криптографски безбеден генератор на случајни броеви. За разлика од Math.random(), кој е предвидлив и несоодветен за безбедносни цели, crypto.getRandomValues() обезбедува вистинска ентропија погодна за:
- Генерирање безбедносни токени
- ID на сесии
- API клучеви
- Криптографски апликации
Споредба на UUID верзии
| Верзија | Основа | Судир | Временско подредување | DB перформанси | Употреба |
|---|---|---|---|---|---|
| v1 | Временски печат + MAC | Ниска | ✅ Да | ❌ Полошо | Наследно, ревизија |
| v3 | MD5 хеш | Нема (детерминистичко) | ❌ Не | ⚠️ Средно | Конверзии (наследно) |
| v4 | Случајно | Исклучително ниска | ❌ Не | ⚠️ Средно | Општа употреба |
| v5 | SHA-1 хеш | Нема (детерминистичко) | ❌ Не | ⚠️ Средно | Конверзии (препорачано) |
| v6 | Подреден временски печат | Ниска | ✅ Да | ✅ Подобро | Модерна DB со време |
| v7 | Unix временски печат | Ниска | ✅ Да | ✅ Најдобро | Нови проекти |
UUID наспроти други идентификатори
| Тип | Големина | Судир | Временско подредување | Употреба |
|---|---|---|---|---|
| Auto-increment ID | 4-8 бајти | Гарантирано уникатно во рамките на табелата | ❌ | Едноставни апликации, локална DB |
| UUID v4 | 16 бајти | Практично невозможно | ❌ | Дистрибуирани системи, API |
| UUID v7 | 16 бајти | Практично невозможно | ✅ | Модерна DB со перформанси |
| ULID | 16 бајти | Практично невозможно | ✅ | UUID + лексикографско подредување |
| Snowflake ID | 8 бајти | Гарантирано уникатно со правилна конфигурација | ✅ | Twitter, дистрибуирани системи |
| NanoID | Конфигурабилна | Зависи од должината | ❌ | URL-friendly ID-и |
Имплементација во различни јазици
JavaScript/TypeScript
// UUID v4 - Наједноставен начин (модерни прелистувачи)
const uuid = crypto.randomUUID();
// UUID v4 - Мануелна имплементација
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - Препорачано за бази на податоци
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Излез: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return 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)
);
}
C#
using System;
// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
Најдобри практики
Зачувување UUID во база на податоци
PostgreSQL:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 8.0+:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Совет: Во MySQL, зачувајте ги UUID како BINARY(16) наместо CHAR(36) за заштеда на простор и побрзо индексирање.
Валидација на UUID
function isValidUUID(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return regex.test(uuid);
}
Конверзија на UUID
// Отстранување на цртички
const compact = uuid.replace(/-/g, '');
// Враќање на цртичките
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
Решавање проблеми (Troubleshooting)
UUID v3/v5 не работи
Проблем: Откако ќе изберете v3 или v5, ништо не се генерира
Решение:
- ✅ Проверете дали сте пополниле полето “Име” - задолжително е!
- ✅ Изберете го правилниот именски простор според типот на вашиот влез
- ✅ Примери на валидни влезови:
- DNS:
example.com,google.com - URL:
https://example.com/page - Кој било текст:
my-application-v1
- DNS:
Совет: Обидете се прво со едноставна вредност како test и именски простор DNS.
Временскиот UUID (v1, v6, v7) има чудно време
Проблем: Генерираниот UUID има неочекуван временски печат
Решение:
- ✅ Проверете го бирачот за датум и време - дали е поставено точното време?
- ✅ Бирачот за датум и време ја користи вашата локална временска зона
- ✅ Оставете го бирачот за датум и време празен за тековното време
UUID не може да се копира
Проблем: Копчето “Копирај ги сите” не работи
Решение:
- ✅ Проверете дали сте генерирале UUID (тие не се празни)
- ✅ Некои прелистувачи бараат HTTPS за clipboard API
- ✅ Алтернативно, изберете го текстот во текстуалното поле и копирајте рачно (Ctrl+C)
Често поставувани прашања (ЧПП)
Може ли да дојде до судир на UUID?
Теоретски да, но веројатноста е астрономски мала. При генерирање 1 милијарда UUID v4 во секунда во текот на 100 години, шансата за судир е приближно 0,00000006%. Во пракса, судир никогаш не се случува.Дали UUID е погоден како примарен клуч во база на податоци?
Зависи од случајот на употреба. UUID е идеален за дистрибуирани системи и ситуации каде што ви е потребна глобална уникатност. За едноставни апликации со една база на податоци, авто-инкремент може да биде поефикасен.Дали UUID-ите генерирани со оваа алатка се безбедни?
Да, користиме Web Crypto API (`crypto.getRandomValues()`), кое обезбедува криптографски безбедни случајни вредности. Сè се случува локално во вашиот прелистувач.Која е разликата помеѓу UUID верзиите?
- **v1**: Временски печат + MAC/случајно - хронолошко подредување, полоши DB перформанси - **v3/v5**: Базирани на хеш - детерминистички, за конверзии на познати идентификатори - **v4**: Случајно - најбезбедно, најкористено - **v6**: Преуредено временски печат - подобри DB перформанси од v1 - **v7**: Unix временски печат - најдобри DB перформанси + временско подредувањеКоја UUID верзија треба да ја користам?
За повеќето случаи користете **v4** (случајно). За бази на податоци со временско подредување користете **v7** (модерно) или **v6** (стандардно). За конверзии на познати идентификатори (URL, DNS) користете **v5** (SHA-1).Може ли да користам UUID за токени и API клучеви?
UUID v4 е погоден за ID на сесии и слични токени. За API клучеви размислете за користење подолги случајни стрингови (на пр. 256-битни вредности) или специјализирани библиотеки.Колку големи се UUID-ите?
UUID има 128 бита (16 бајти). Во стринг формат со цртички зафаќа 36 знаци. Без цртички, 32 хексадецимални знаци.Алтернативи на UUID
ULID (Универзален уникатен лексикографски подредлив идентификатор)
- 128-битен ID (исто како UUID)
- Лексикографски подредлив според времето на креирање
- Покомпактна репрезентација (26 знаци наместо 36)
- Base32 кодирање без разлика на големина на букви
Пример: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- Помала големина од UUID (стандардно 21 знак)
- Пријателски за URL (без специјални знаци)
- Побрзо генерирање
- Конфигурабилна должина и азбука
Пример: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (Twitter)
- 64-битен ID (помал од UUID)
- Временски подредлив
- Содржи ID на работник и секвенцен број
- Бара централизирана конфигурација
Пример: 1234567890123456789
Перформанси и оптимизација
Брзина на генерирање
Нашиот генератор може да генерира:
- 1 UUID: < 1 ms
- 100 UUID: ~10-20 ms
- 1000 UUID: ~100-200 ms
Совети за перформанси
- Сериско генерирање – Ако ви требаат многу UUID, генерирајте ги сите одеднаш наместо еден по еден
- Зачувување во DB – Индексирајте ги UUID колоните за брзо пребарување
- Компресија – Зачувајте ги UUID во бинарен облик (16 бајти) наместо стринг (36 бајти)
- Кеширање – Во некои случаи можете да ги претходно генерирате и кеширате UUID
За програмери
Структура на UUID v4
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48 бита случајни податоци (јазол)
| | | └────── 16 бита случајни податоци со варијанта (clock_seq)
| | └─────────── 12 бита случајни податоци + 4 бита верзија (time_hi_and_version)
| └──────────────── 16 бита случајни податоци (time_mid)
└───────────────────────── 32 бита случајни податоци (time_low)
- Верзија (4 бита): секогаш
0100(бинарно) =4(хексадецимално) - Варијанта (2-3 бита): секогаш
10(бинарно) за RFC 4122
Тестирање на UUID
// Jest тест
describe('UUID Генератор', () => {
test('генерира валиден UUID v4', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('генерира уникатни UUID-и', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
Безбедносни аспекти
Што да не се прави со UUID
❌ Не користете UUID v1 за чувствителни апликации – Содржи временски печат, што може да претставува безбедносен ризик
❌ Не користете Math.random() за генерирање UUID – Не е криптографски безбедно
❌ Не се потпирајте на UUID за авторизација – UUID може да се погоди (иако со исклучително мала веројатност)
❌ Не зачувувајте UUID во колачиња без шифрирање – Користете потпишани колачиња или JWT
Што да се прави
✅ Користете UUID v4 за повеќето случаи – Највисока ентропија и безбедност
✅ Комбинирајте UUID со други безбедносни мерки – За управување со сесии користете HTTPS, HttpOnly колачиња и краток рок на истекување
✅ Валидирајте UUID на серверот – Секогаш проверувајте го форматот и верзијата на UUID
✅ Користете криптографски безбедни извори на случајност – crypto.getRandomValues() во прелистувачот, /dev/urandom на Linux
Интересни факти
- Број на можни UUID v4: 2^122 ≈ 5.3 × 10^36 (340 ундецилиони)
- Потребен судир: За 50% шанса за судир, треба да генерирате 2.71 × 10^18 UUID (2.71 квинтилиони)
- Големина на сите можни UUID: Ако секој UUID го зачуваме како 16 бајти, целиот простор би зафатил 85 зетабајти (85 милијарди терабајти)
- Потекло: UUID беше стандардизиран како дел од DCE (Distributed Computing Environment) во 1990 година