uuid のバージョン番号を簡単に抽出できることはわかっています。タイムスタンプ、MAC アドレスなどの情報を抽出する信頼できる方法はありますか?
ありがとう!
標準準拠の UUID は、次のようないくつかのバリアントの 1 つである可能性があります。
AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFFFF
DDDD 部分の最初の (16 進数) 桁がバリアントを決定します。
8、9、A、B のいずれかである場合、現在の仕様に準拠しています (0 ~ 7 は下位互換性のために予約されており、C、D は Microsoft のために予約されており、E、F は将来の使用のために予約されています)。
現在の仕様に準拠している場合は、UUID バージョンを決定する CCCC 部分の最初の桁を確認します。
バージョン 4 は単純にランダムに選択されます。
バージョン 3 と 5 は、いくつかのビットをハッシュして破棄することによって生成されます。つまり、そこから情報を復元する機会は基本的にありません。ビルド方法の詳細については、RFC4122またはUUID ジェネレーターの Web ページを参照してください。
バージョン 2 の UUID が見つからなかったため、データの抽出方法を確認しませんでした。
バージョン 1 は、タイムスタンプと現在のホスト MAC アドレスから生成されます。(標準では、MAC アドレスの「ブロードキャスト/マルチキャスト」ビットを設定すると、代わりにランダム アドレスを使用することもできます。)
次の perl 抜粋は、バージョン 1 uuid から MAC アドレスと時間を解析します。
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";
};
最後になりましたが、 GPT パーティションなど、いくつかの割り当てられた UUID があります。
UUID の種類によっては、完全にランダムなビットから生成されるか、タイムスタンプに基づいて生成されるか、MAC アドレスに基づいて生成される可能性があるため、必ずしも信頼できる方法ではありません。そのため、その情報の一部を取得できる可能性がありますが、何かを取得できるとは限りません。
これに関する公式のリファレンスはRFC 4122であり、おそらくデータを抽出するのに十分な情報が得られるはずですが、あまり信頼するべきではありません。
バージョン 1 UUID の場合、MAC アドレスは最後の 12 桁の 16 進数になります。
Uuid のバージョンを調べることもできますが、Uuid が有効であることが確実な場合にのみ信頼できます ( https://www.rfc-editor.org/rfc/rfc4122を参照)。バージョンは、あなたが持っているUuidの種類を教えてくれ、それを使って特定の情報を抽出することができます.