UUID

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

UUID

Непрочитанное сообщение Olej » 26 май 2021, 19:17

Про UUID (Universally Unique Identifier) мы все знаем в контексте id дисков:
переместить систему с HDD на SSD
своп в оперативную память - модуль zRam | zSwap
загрузка: восстановление и оптимизация
и мн. др.

Например так:

Код: Выделить всё

olej@R420:~$ inxi -Dxx
Drives:    Local Storage: total: 1.15 TiB used: 172.03 GiB (14.7%) 
           ID-1: /dev/nvme0n1 vendor: Samsung model: SSD 980 PRO 250GB size: 232.89 GiB speed: 63.2 Gb/s lanes: 4 
           serial: S5GZNF0R115271A 
           ID-2: /dev/sda vendor: Toshiba model: THNSF8120CCSE size: 111.79 GiB speed: <unknown> serial: N/A 
           ID-3: /dev/sdb vendor: Western Digital model: WD2500AAKX-0 size: 232.89 GiB speed: <unknown> serial: N/A 
           ID-4: /dev/sdc vendor: Samsung model: HM641JI size: 596.17 GiB speed: <unknown> serial: N/A 

Код: Выделить всё

olej@R420:~$ blkid
/dev/nvme0n1p1: UUID="d834630f-33c1-4013-8226-f82d5acb74c1" TYPE="ext4" PARTUUID="9694aa64-01"
/dev/sda1: UUID="682F-17EA" TYPE="vfat" PARTUUID="000bfcf6-01"
/dev/sda5: UUID="cf9475ca-8800-482b-9d09-308b2e1d2445" TYPE="ext4" PARTUUID="000bfcf6-05"
/dev/sdb2: UUID="d2e5bbdc-abb2-480f-b601-0ad178f6b831" TYPE="ext4" PARTUUID="000bfcf6-02"

Код: Выделить всё

olej@R420:~$ df
Файл.система   1K-блоков Использовано  Доступно Использовано% Cмонтировано в
udev            49425220            0  49425220            0% /dev
tmpfs            9894556         2004   9892552            1% /run
/dev/sda5      114335908     32001380  76939624           30% /
tmpfs           49472760       554496  48918264            2% /dev/shm
tmpfs               5120            0      5120            0% /run/lock
tmpfs           49472760            0  49472760            0% /sys/fs/cgroup
/dev/nvme0n1p1 239315456     52349428 174739776           24% /home
/dev/sdb2      239839744      6744316 220869204            3% /home/olej/Загрузки
/dev/sda1         523248            4    523244            1% /boot/efi
tmpfs            9894552           32   9894520            1% /run/user/1000
/dev/sdc1      614271992     89287216 493711868           16% /run/timeshift/backup
Это специально на накрученном промышленном сервере DELL R420, чтобы было разнообразнее :lol:
P.S. Только сейчас заметил что для бэкап-диска Timeshift нет UUID - почему надо разобраться.

Но UUID - это общий способ генерации уникальных 128-битных чисел в задачах программирования и вообще в IT-технологиях.

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 19:28

Olej писал(а):
26 май 2021, 19:17
Но UUID - это общий способ генерации уникальных 128-битных чисел в задачах программирования и вообще в IT-технологиях.
Как генерируются UUID
https://habrastorage.org/webt/v5/gp/f-/ ... vowos.jpeg
Давайте рассмотрим основные аспекты реализации и разберёмся, почему UUID практически уникальны, поскольку существует мизерная возможность возникновения одинаковых значений.

Современную реализацию UUID можно проследить до RFC 4122, в котором описано пять разных подходов к генерированию этих идентификаторов. Мы рассмотрим каждый из них и пройдёмся по реализации версии 1 и версии 4.
UUID (universally unique IDentifier) — это 128-битное число, которое в разработке ПО используется в качестве уникального идентификатора элементов. Его классическое текстовое представление является серией из 32 шестнадцатеричных символов, разделённых дефисами на пять групп по схеме 8-4-4-4-12.

Например:

Код: Выделить всё

3422b448-2460-4fd2-9183-8000de6f8343
Информация о реализации UUID встроена в эту, казалось бы, случайную последовательность символов:

Код: Выделить всё

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Значения на позициях M и N определяют соответственно версию и вариант UUID.

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 19:30

Olej писал(а):
26 май 2021, 19:28
почему UUID практически уникальны
Может показаться, что если у вас будет достаточно времени, то вы сможете повторить какое-то значение. Особенно в случае с версией 4. Но в реальности это не так. Если бы вы генерировали один миллиард UUID в секунду в течение 100 лет, то вероятность повторения одного из значений была бы около 50 %. Это с учётом того, что ГПСЧ обеспечивает достаточное количество энтропии (истинная случайность), иначе вероятность появления дубля будет выше. Более наглядный пример: если бы вы сгенерировали 10 триллионов UUID, то вероятность появления двух одинаковых значений равна 0,00000006 %.
Are UUIDs really unique?
Изображение

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 19:32

Olej писал(а):
26 май 2021, 19:17
в задачах программирования и вообще в IT-технологиях.

Код: Выделить всё

olej@R420:~$ which uuidgen
/usr/bin/uuidgen

Код: Выделить всё

olej@R420:~$ uuidgen --help

Использование:
 uuidgen [параметры]

Создание нового значения UUID.

Параметры:
 -r, --random        generate random-based uuid
 -t, --time          generate time-based uuid
 -n, --namespace ns  generate hash-based uuid in this namespace
 -N, --name name     generate hash-based uuid from this name
 -m, --md5           generate md5 hash
 -s, --sha1          generate sha1 hash
 -x, --hex           interpret name as hex string

 -h, --help       показать эту справку
 -V, --version    показать версию

Для более детальной информации смотрите uuidgen(1).

Код: Выделить всё

olej@R420:~$ uuidgen -r
7ee39d1c-3dd1-4ecf-a9b9-366201d521ad

Код: Выделить всё

olej@R420:~$ uuidgen -t
ff9e5620-be3f-11eb-aecb-4d4e259b9a50

olej@R420:~$ uuidgen -t
032706b6-be40-11eb-aecb-4d4e259b9a50

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 19:52

А это непосредственно генерация UUID (какой версии?) ядром Linux:

Код: Выделить всё

olej@R420:/usr/include$ cat /proc/sys/kernel/random/uuid
9f89de94-4da7-436d-ab75-9db8633c5c20

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 22:42

Код: Выделить всё

olej@R420:/usr/include$ aptitude search uuid-dev
p   golang-github-gofrs-uuid-dev                                                     - UUID library for Golang
p   golang-github-google-uuid-dev                                                    - generates and inspects UUIDs based on RFC 4122
p   golang-github-hashicorp-go-uuid-dev                                              - generate UUID-format strings using high quality random bytes
p   golang-github-hashicorp-uuid-dev                                                 - UUID generation using purely high quality random bytes
p   golang-github-nu7hatch-gouuid-dev                                                - pure Go UUID implementation as specified in RFC 4122
p   golang-github-pborman-uuid-dev                                                   - Go bindings to work with UUIDs
p   golang-github-rogpeppe-fastuuid-dev                                              - fast generation of 192-bit UUIDs
p   golang-github-satori-go.uuid-dev                                                 - Go package for creating and parsing UUID
p   golang-github-twinj-uuid-dev                                                     - RFC 4122 and DCE 1.1 compliant UUIDs in Go
v   golang-uuid-dev                                                                  -
p   libghc-uuid-dev                                                                  - create, compare, parse and print Universally Unique Identifiers
v   libghc-uuid-dev-1.3.13-cf3f3                                                     -
p   libossp-uuid-dev                                                                 - OSSP uuid ISO-C and C++ - headers and static libraries
p   librust-core-foundation+uuid-dev                                                 - Bindings to Core Foundation for macOS - feature "uuid" and 1 more
v   librust-core-foundation+with-uuid-dev                                            -
v   librust-core-foundation-0+uuid-dev                                               -
v   librust-core-foundation-0+with-uuid-dev                                          -
v   librust-core-foundation-0.6+uuid-dev                                             -
v   librust-core-foundation-0.6+with-uuid-dev                                        -
v   librust-core-foundation-0.6.4+uuid-dev                                           -
v   librust-core-foundation-0.6.4+with-uuid-dev                                      -
p   librust-uuid-dev                                                                 - Generate and parse UUIDs - Rust source code
p   uuid-dev                                                                         - Universally Unique ID library - headers and static libraries
p   uuid-dev:i386                                                                    - Universally Unique ID library - headers and static libraries

Код: Выделить всё

olej@R420:/usr/include$ sudo apt install uuid-dev
[sudo] пароль для olej:
Попробуйте ещё раз.
[sudo] пароль для olej:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Следующие НОВЫЕ пакеты будут установлены:
  uuid-dev
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 33,6 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 171 kB.
Пол:1 http://mirror.mirohost.net/ubuntu focal-updates/main amd64 uuid-dev amd64 2.34-0.1ubuntu9.1 [33,6 kB]
Получено 33,6 kB за 0с (252 kB/s)
Выбор ранее не выбранного пакета uuid-dev:amd64.
(Чтение базы данных … на данный момент установлено 378318 файлов и каталогов.)
Подготовка к распаковке …/uuid-dev_2.34-0.1ubuntu9.1_amd64.deb …
Распаковывается uuid-dev:amd64 (2.34-0.1ubuntu9.1) …
Настраивается пакет uuid-dev:amd64 (2.34-0.1ubuntu9.1) …
Обрабатываются триггеры для man-db (2.9.1-1) …

Код: Выделить всё

olej@R420:/usr/include/uuid$ pwd
/usr/include/uuid

olej@R420:/usr/include/uuid$ ls
uuid.h

Код: Выделить всё

olej@R420:/usr/include/uuid$ man uuid_generate
...
SYNOPSIS
       #include <uuid.h>

       void uuid_generate(uuid_t out);
       void uuid_generate_random(uuid_t out);
       void uuid_generate_time(uuid_t out);
       int uuid_generate_time_safe(uuid_t out);
       void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len);
       void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t len);
...

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 22:43

C API :

Код: Выделить всё

olej@R420:/usr/include$ aptitude search uuid-dev
p   golang-github-gofrs-uuid-dev                                                     - UUID library for Golang
p   golang-github-google-uuid-dev                                                    - generates and inspects UUIDs based on RFC 4122
p   golang-github-hashicorp-go-uuid-dev                                              - generate UUID-format strings using high quality random bytes
p   golang-github-hashicorp-uuid-dev                                                 - UUID generation using purely high quality random bytes
p   golang-github-nu7hatch-gouuid-dev                                                - pure Go UUID implementation as specified in RFC 4122
p   golang-github-pborman-uuid-dev                                                   - Go bindings to work with UUIDs
p   golang-github-rogpeppe-fastuuid-dev                                              - fast generation of 192-bit UUIDs
p   golang-github-satori-go.uuid-dev                                                 - Go package for creating and parsing UUID
p   golang-github-twinj-uuid-dev                                                     - RFC 4122 and DCE 1.1 compliant UUIDs in Go
v   golang-uuid-dev                                                                  -
p   libghc-uuid-dev                                                                  - create, compare, parse and print Universally Unique Identifiers
v   libghc-uuid-dev-1.3.13-cf3f3                                                     -
p   libossp-uuid-dev                                                                 - OSSP uuid ISO-C and C++ - headers and static libraries
p   librust-core-foundation+uuid-dev                                                 - Bindings to Core Foundation for macOS - feature "uuid" and 1 more
v   librust-core-foundation+with-uuid-dev                                            -
v   librust-core-foundation-0+uuid-dev                                               -
v   librust-core-foundation-0+with-uuid-dev                                          -
v   librust-core-foundation-0.6+uuid-dev                                             -
v   librust-core-foundation-0.6+with-uuid-dev                                        -
v   librust-core-foundation-0.6.4+uuid-dev                                           -
v   librust-core-foundation-0.6.4+with-uuid-dev                                      -
p   librust-uuid-dev                                                                 - Generate and parse UUIDs - Rust source code
p   uuid-dev                                                                         - Universally Unique ID library - headers and static libraries
p   uuid-dev:i386                                                                    - Universally Unique ID library - headers and static libraries

Код: Выделить всё

olej@R420:/usr/include$ sudo apt install uuid-dev
[sudo] пароль для olej:
Попробуйте ещё раз.
[sudo] пароль для olej:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Следующие НОВЫЕ пакеты будут установлены:
  uuid-dev
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 33,6 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 171 kB.
Пол:1 http://mirror.mirohost.net/ubuntu focal-updates/main amd64 uuid-dev amd64 2.34-0.1ubuntu9.1 [33,6 kB]
Получено 33,6 kB за 0с (252 kB/s)
Выбор ранее не выбранного пакета uuid-dev:amd64.
(Чтение базы данных … на данный момент установлено 378318 файлов и каталогов.)
Подготовка к распаковке …/uuid-dev_2.34-0.1ubuntu9.1_amd64.deb …
Распаковывается uuid-dev:amd64 (2.34-0.1ubuntu9.1) …
Настраивается пакет uuid-dev:amd64 (2.34-0.1ubuntu9.1) …
Обрабатываются триггеры для man-db (2.9.1-1) …

Код: Выделить всё

olej@R420:/usr/include/uuid$ pwd
/usr/include/uuid

olej@R420:/usr/include/uuid$ ls
uuid.h

Код: Выделить всё

olej@R420:/usr/include/uuid$ man uuid_generate
...
SYNOPSIS
       #include <uuid.h>

       void uuid_generate(uuid_t out);
       void uuid_generate_random(uuid_t out);
       void uuid_generate_time(uuid_t out);
       int uuid_generate_time_safe(uuid_t out);
       void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len);
       void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t len);
...

Код: Выделить всё

olej@R420:/usr/include/uuid$ man uuid_unparse
...
SYNOPSIS
       #include <uuid.h>

       void uuid_unparse(uuid_t uu, char *out);
       void uuid_unparse_upper(uuid_t uu, char *out);
       void uuid_unparse_lower(uuid_t uu, char *out);
...

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 23:02

Olej писал(а):
26 май 2021, 22:43

Код: Выделить всё

olej@R420:/usr/include/uuid$ man uuid_unparse
код C

Код: Выделить всё

olej@R420:~/2021/OWN_TEST.codes/UUID$ cat linux_uuid_test.c 
#include <uuid/uuid.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  uuid_t id;
  uuid_generate(id);

  char string[100]; // = new char[100];
  uuid_unparse(id, string);

  printf("%s\n", string);

  return 0;
}

Код: Выделить всё

olej@R420:~/2021/OWN_TEST.codes/UUID$ gcc linux_uuid_test.c -o linux_uuid_test -luuid

olej@R420:~/2021/OWN_TEST.codes/UUID$ ./linux_uuid_test 
3a19d19a-78c3-4fcf-aa6a-68af26b162a3
Вложения
linux_uuid_test.c
(223 байт) 10 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 23:04

Olej писал(а):
26 май 2021, 22:43

Код: Выделить всё

void uuid_unparse(uuid_t uu, char *out);
код C++

Код: Выделить всё

olej@R420:~/2021/OWN_TEST.codes/UUID$ cat linux_uuid_test.cpp
#include <uuid/uuid.h>
#include <iostream>

int main(int argc, char *argv[])
{
  uuid_t id;
  uuid_generate(id);

  char *string = new char[100];
  uuid_unparse(id, string);

  std::cout << string << std::endl;

  return 0;
}

Код: Выделить всё

olej@R420:~/2021/OWN_TEST.codes/UUID$ g++ linux_uuid_test.cpp -o linux_uuid_test -luuid

olej@R420:~/2021/OWN_TEST.codes/UUID$ ./linux_uuid_test 
a4bfc014-7990-44d0-8c9b-93f05a2a6e47
Вложения
linux_uuid_test.cpp
(226 байт) 11 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: UUID

Непрочитанное сообщение Olej » 26 май 2021, 23:51

Массово предлагаются по Интернет такие вот доморощенные реализации UUID:

Код: Выделить всё

srand(time(NULL));

sprintf(strUuid, "%x%x-%x-%x-%x-%x%x%x", 
    rand(), rand(),                 // Generates a 64-bit Hex number
    rand(),                         // Generates a 32-bit Hex number
    ((rand() & 0x0fff) | 0x4000),   // Generates a 32-bit Hex number of the form 4xxx (4 indicates the UUID version)
    rand() % 0x3fff + 0x8000,       // Generates a 32-bit Hex number in the range [0x8000, 0xbfff]
    rand(), rand(), rand());        // Generates a 96-bit Hex number
Но это полностью противоречит тем "версиям", которые описаны в тексте в начале этой темы. :-(

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя