Ответ 1
Стандартно-совместимый UUID может быть одним из нескольких вариантов, он выглядит так:
AAAAAAAA-BBBB-КЦИК-DDDD-FFFFFFFFFFFF
Первая (шестнадцатеричная) цифра части DDDD определяет вариант.
Если это один из 8,9, A, B соответствует текущей спецификации (0-7 зарезервированы для обратной совместимости, C, D зарезервированы для Microsoft, а E, F зарезервированы для будущего использования)
Если он соответствует текущей спецификации, проверьте первую цифру части CCCC, которая определяет версию UUID:
- Время с уникальным или случайным идентификатором хоста (MAC)
- Версия DCE Security (с идентификаторами POSIX)
- Основанный на имени (хэш MD5)
- Случайное
- Основанный на имени (SHA-1 хэш)
Версия 4 выбирается случайным образом.
Версии 3 и 5 генерируются путем хэширования и отбрасывания некоторых битов, что означает, что у вас практически нет возможности восстановить какую-либо информацию из него. Подробности о том, как его построить, можно найти в RFC4122 или в Веб-страница генератора UUID.
Я не смог найти UUID версии 2, поэтому я не проверял, как извлекать данные.
Версия 1 генерируется на основе временного штампа и текущего MAC-адреса хоста. (Стандарт также позволяет вместо этого использовать случайный адрес, если вы установите бит "широковещательная/многоадресная передача" MAC-адреса.)
Следующий perl snipped анализирует MAC-адрес и Time из версии 1 uuid:
my $uuid="AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF";
$uuid=~tr/-//d;
my $time_low=hex substr($uuid,2* 0,2*4);
my $time_mid=hex substr($uuid,2* 4,2*2);
my $version =hex substr($uuid,2* 6,1);
my $time_hi =hex substr($uuid,2* 6+1,2*2-1);
my $time=($time_hi*(2**16)+$time_mid)*(2**32)+$time_low;
my $epoc=int($time /10000000) - 12219292800;
my $nano=$time-int($time/10000000)*10000000;
my $clk_hi =hex substr($uuid,2* 8,2*1);
my $clk_lo =hex substr($uuid,2* 9,2*1);
my $node =substr($uuid,2*10,2*6);
$node=~/^(..)(..)(..)(..)(..)(..)$/ || die;
$node="$1:$2:$3:$4:$5:$6";
print "time: ",scalar localtime $epoc," +",$nano/10000,"ms\n";
print "clock id: ",$clk_hi*256+$clk_lo,"\n";
print "Mac: $node\n";
my $byte=hex $1;
if(hex($1)&1){
print "broadcast/multicast bit set.\n";
};
И последнее, но не менее важное: существует несколько назначенных UUID, например, для разделов GPT.