ГОСТ Р ИСО/МЭК 9834-8—2011
/* uuid_compare -- Сравнить два УУИд ’лексически" и вернуть
-1и1 лексически до и2
0 и1 лексически равен и2
1 u1лексически после u2
Лексическое упорядочение не является временным!
•I
int uuld_compare(uuid_t *u1. uuld_t *u2);
0.4 Файл uuld.c
«include ’copyrt.h’
«include <slring.h>
«include <stdio.h>
«include <stdhb.h>
«include <time.h>
«include’sysdep.h*
ffifndef_WINDOWS_
«include <arpa/inet.h>
«endrf
«include «uutd.h*
/* Различные начальные декларации 7
static Ini read_stale(unslgned16 ’clockseq. uuid_time_t ’timestamp.
uuid_node_t’node);
static void write_state(unsigned16 clockseq. uuld_time_t timestamp.
uuid_node_t node);
static void <ormat_uuid_v1 (uuid_t *uuid. unsigned16 clockseq.
uuid_tlme_t timestamp. uuid_node_t node);
static void format_uuid_v3(uutd_t *uuid. unsigned char hashfl6]);
static void get_current_time(uuld_time_t ’timestamp),
static unslgned16 true_random(void);
Г uuld_create -- генератор УУИд 7
Int uuid_create(uuid_t ’uuid)
(
uuid_tlme_t timestamp. !ast_time;
unsigned 16 clockseq;
uuid_node_t node;
uuid_node_t last_node:
mtf;
Г запросить общесистемную блокировкуV
LOCK;
Г получить время, идентификатор узла, сохраненное состояние
из неизменяемой памяти V
get_current_time(×tamp);
get_leee_nodeJdentifier(&node);
f = read_state(&clockseq. &last_time. &last_node);
Г если состояние невалидно, или часы отошли назад,
или изменился идентификатор узла (например,
новая сетевая карта), изменить clockseq V
if (!f || memcmp(&node, &last_node. slzeof node))
clockseq = true_random();
else if (timestamp < last_time)
clockseq**;
Г сохранить состояние для следующего разаV
wrlte_state(clockseq. timestamp, node).
UNLOCK;
Г установить поля в УУИд V
18