Вопросы написания собственного программного кода (на любых языках)
Модератор: Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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, чтобы было разнообразнее
P.S. Только сейчас заметил что для бэкап-диска Timeshift нет UUID - почему надо разобраться.
Но UUID - это
общий способ генерации
уникальных 128-битных чисел в задачах программирования и вообще в IT-технологиях.
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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.
Например:
Информация о реализации UUID встроена в эту, казалось бы, случайную последовательность символов:
Значения на позициях M и N определяют соответственно версию и вариант UUID.
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
Olej » 26 май 2021, 19:30
Olej писал(а): ↑26 май 2021, 19:28
почему UUID практически уникальны
Может показаться, что если у вас будет достаточно времени, то вы сможете повторить какое-то значение. Особенно в случае с версией 4. Но в реальности это не так. Если бы вы генерировали один миллиард UUID в секунду в течение 100 лет, то вероятность повторения одного из значений была бы около 50 %. Это с учётом того, что ГПСЧ обеспечивает достаточное количество энтропии (истинная случайность), иначе вероятность появления дубля будет выше. Более наглядный пример: если бы вы сгенерировали 10 триллионов UUID, то вероятность появления двух одинаковых значений равна 0,00000006 %.
Are UUIDs really unique?
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
Olej » 26 май 2021, 19:52
А это непосредственно генерация UUID (какой версии?) ядром Linux:
Код: Выделить всё
olej@R420:/usr/include$ cat /proc/sys/kernel/random/uuid
9f89de94-4da7-436d-ab75-9db8633c5c20
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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 байт) 51 скачивание
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
Olej » 26 май 2021, 23:04
Olej писал(а): ↑26 май 2021, 22:43
код 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 байт) 57 скачиваний
Olej
-
Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
-
Контактная информация:
Непрочитанное сообщение
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
Но это полностью противоречит тем "версиям", которые описаны в тексте в начале этой темы.
Olej
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей