ГОСТ Р ИСО/МЭК 9834-8—2011
К (United) {
get_system_time(&tlme_now);
time_now = time_now / UUIDS_PER_TICK;
srand((unsigned mt)(«tlme_now >> 32)Atime_now) & Oxffffffff)).
Inited = 1;
)
return rand():
}
/’uuid_create_from_name --создать УУИд, используя «имя» из
’пространства имен" */
void uuid_create_from_name(uuid_t ’uuid, uuid_t nsid, void ’name,
Int namelen)
{
MD5_CTXc:
unsigned charhash{16];
uuld_t net_nsid:
/•поместить идентификатор пространства имен а сетевом порядке байтов, чтобы его хеширование
не зависело от используемой машины ’/
net_nstd - nsid;
htonl(net_nsld.time_low);
htons{net_nsKJ.tlme_m»d);
htons(net_nsid.tlme_hi_and_verslon);
MD5lmt(&c);
MD5Update(&c, &net_nsld, sizeof net_nsid);
MD5Update(8c. name, namelen);
MD5Fmal(nash. &c);
/’здесь хеш в сетевом порядке байт’/
format_uuKl_v3(uuid. hash);
}
/’format_uuld_v3 -- создать УУИд из (псевдоСлучайного 128-битового числа ’/
void format_umd_v3(uu»d_t*uu!d, unsigned charhash(16J)
{
/’преобразовать УУИд к локальному порядку байтов’/
memcpy(uuid. hash, sizeof *uuld);
ntohi(uutd->time_k>w):
ntohs(uuid->time_mld);
ntohs(uuld->time_hl_and_vers«3n).
/’ записать uuld варианта и версии */
uuld->time_hi_and_version &= OxOFFF.
uuid->tlme_hi_and_version |= (3<< 12);
uuid->ctock_seq_hi_and_reserved &= 0x3F;
uuid->clock_seq_hi_and_reserved |= 0x80;
}
/* uuid_compare - сравнить два УУИд «лексически» ’/
sdefine CHECK(f1. f2) if (f1 != f2) return f1 < f2 ? -1 :1 ;
mt uuid_compare(uuld_t *u1. uu»d_t ’u2)
{
inti;
CHECK(u1->tlme_low. u2->time_low);
CHECK(u1->tlme_mld. u2->time_mld),
CHECK(u1->time_hi_and_verslon, u2->tlme_hi_and_version);
CHECK(u 1->clock_seq_hi_and_reserved.
u2->clock_seq_hi_and_reserved);
21