UUIDのバージョン4の実装がシンプル且つjs及びビット演算の再確認になったため、ここにメモを残します。
UUIDとは
Universally Unique Identifier。ソフトウェア上でオブジェクトを一意に識別するための識別子である。UUIDは128ビットの数値だが、16進法による550e8400-e29b-41d4-a716-446655440000というような文字列による表現が使われることが多い。元来は分散システム上で統制なしに作成できる識別子として設計されており、したがって将来にわたって重複や偶然の一致が起こらないという前提で用いることができる。
UUIDのバージョン4は、16進表記では、RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRRという形式で表される。3番目のブロックの先頭はバージョン4を表す。4番目のブロックの先頭は現行の規格では上位2ビットが10であることが定められているので、16進表記では8(1000)、9(1001)、A(1010)、B(1011)のいずれかとなる。 1
UUIDバージョン4の実装サンプル(js)2
function generateUUIDv4() {
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
return uuid;
}
メモ
- replace関数。第一引数。xあるいはyの文字列を正規表現でひっかけている。
- replace関数。第二引数にfunctionを指定することができる。
- Math.randomの行。 Math.random()は0以上1未満の範囲の浮動小数。
Math.random()*16は0 ~ 15の整数。それに0とのOR演算を行っており、これで整数化している(ビット演算時に32ビット整数に変換される)。
> var s = Math.random() * 16;
> var n = s | 0;
> console.log('s=' + s + ', n=' + n);
s=8.660867119575208, n=8
s=3.4914822265590573, n=3
s=0.8758466412762864, n=0
- v=の行。3項演算子の形式となっている。
cが'x'の場合は0 ~ 15の整数、それ以外の場合は8、9、A、B(16進表記)となる。 - r & 0x3 | 0x8 に関して。0 ~ 15の整数と3のAND演算となる。この演算で0 ~ 15の整数の下位2ビットを抽出している。
それに8のOR演算を行っている。これは上位2ビットの10を作っている(8(1000))。
例:整数が5の場合
5(0101) & 3(0011) | 8(0011) = 1(0001) | 8(1000) = 9(1001)
例:整数が14の場合
14(1110) & 3(0011) | 8(0011) = 2(0010) | 8(1000) = 10(1010)(16進表記でA) - toString(16)で16進表記の文字列に変換。
-
ChatGPTに「UUIDのVersion4を生成する関数をJavascript作成してほしいです」とお願いして生成 ↩