UUID.js が UUID version 1 に対応しました
- 2008-10-04
- カテゴリ: Client Side
- タグ: JavaScript UUID アルゴリズム
[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)
今までは UUID version 4 にしか対応していなかった UUID.js を、UUID version 1 にも対応させてみました。
使い方
使い方はやっぱり簡単。
- 1. UUID.js をロードする
<script type="text/javascript" src="uuid.js"></script>
- 2. 引数に
{ version: 1 }
を渡して生成する var uuid = UUID.generate({ version: 1 }); // "3db93340-91f7-11dd-a2aa-69df78d74e01"
引数を渡さずに生成すれば、前回通り version 4 の UUID を生成するよ!
サンドボックス
f2b76660-91fa-11dd-97c1-11a6dbe8f7c6
version 1 と 4 は何が違うの?
version 4 は 6 ビットの定数ビットを除いた 122 ビットが全部ランダムに決まってるよ!
version 1 は現在時刻とネットワークカードの MAC アドレスを使って ID を生成しているよ!だから、生成するマシンが違えば必ず違う ID が生成されるようになってて、しかも同じ時間に生成されても違う ID が生成されるように工夫されているよ!
でも、JavaScript では MAC アドレスは取得できないから、UUID.js では MAC アドレスの代わりに乱数を使っているよ!
テストケース
version 1 に対応した UUID.js を公開するついでに、UUID.js を作るために作ったテストケースを公開しておこうかと思います。
テストケースでは、version 1 の UUID と version 4 の UUID をそれぞれ一万個ずつ生成して、次のことをチェックしています。
- 生成された文字列の長さが 36 になっているか
- ハイフンと十六進数字以外の文字が混ざっていないか
- ハイフンの位置は適切か
- version が正しくセットされているか
- variant が正しくセットされているか
- node 部の multicast/unicast フラグが multicast にセットされているか (version 1のみ)
- 生成された一万個の中に重複した ID がないか
それぞれのテストの意味は RFC 4122 を読んで調べてみてください。
見てわかるとおり、正しく一様な乱数が生成されているかどうかや、version 1 のタイムスタンプが適切にセットされているかどうかなどはノーチェックなので、がんばって目視でチェックするしかないです。
@todo
- 乱数生成アルゴリズムの改良
-
[急務] 32 ビット精度の乱数を合成して 48 ビットの良い乱数を作る方法がわからないよ><
乱数論とか文系の守備範囲外だよ><
RFC 1750 とか読んでも全然意味がわからないよ><
誰か教えて><
関連記事
- [JavaScript] Gears オブジェクトをプロトタイプ継承すると Firefox が即死する件
- UUID.js を CodeRepos に放流しました
- UUID.js が UUID version 1 に対応しました
- [UUID.js] バグがあったので修正しました><
- [JavaScript] UUID.jsを作成しました
トラックバック URL
- http://liosk.blog103.fc2.com/tb.php/156-9b553566
トラックバック
コメント
-
高品質の乱数といえばMersenne Twister。
http://homepage2.nifty.com/magicant/sjavascript/mt.html- 2008-10-04
- by yam
- id:-
-
おー!メルセンヌツイスタを JavaScript で実装したものがあったんですね!
でも、リンク先の mt.js でも 32 ビットの乱数までしか生成できないようだし、そもそもメルセンヌツイスタは暗号論的乱数じゃないから、この目的には使えないっぽいっす><- 2008-10-04
- by LiosK
- id:-
-
JavaScriptのActivation Objectを理解しようとして、ここにたどり着きました。
さて、本題なのですが、こちら、Fedora Core9上のfirefox3.0.2と、ubuntu8.0.4のfirefox3.0.3でサンドボックスの[生成]ボタンをクリックしてみたところ、最初の8桁は常に異なる値で生成されていますが、残りは同じ値になります(どちらも仮想マシンではない異なるハードウェア環境)。
再読み込みすると、全部が変更されるのですが、その後は同じ現象になります。サンドボックスだけの現象でしょうか?。それとも、私だけの現象でしょうか(ちなみに、前回のUUID version 4のサンドボックスでは、すべての値がどちらの環境でも変更されます)。。。
既知の現象かもしれませんのがコメントさせてもらいました。タグリストを見ると面白そうな話題がたくさんありますね。また寄らせてもらいます。- 2008-10-29
- by katana
- id:uYRd4Z.Q
- 編集
-
丁寧にありがとうございます。
上8桁以外の数値が一定になるのはUUID version 1の仕様です。version 1では、下48ビットにMACアドレスをそのまま使う仕組みになっているので、同じマシンから生成するUUIDの下48ビットは基本的に全て同じになります。こうすることで、MACアドレスが重複しない限りは別々のマシンから同じUUIDが生成されないようになっているんですね!
UUID.jsではMACアドレスを取れないので、初期化するときにMACアドレスのかわりに48ビットの乱数を使っています。だから、再読込すると全部が変更される仕組みになっています。
ちなみにUUID version 1では、上60ビットに現在時間を使っているから、同じマシンでも生成時間が違えば重複しません。さらに、カウンタ変数の値をいつも付加するので、生成時間が同じでも別のUUIDが生成されるように工夫されています。- 2008-10-31
- by LiosK
- id:-
-
なるほど、そういう仕様だったんですね。UUIDの仕様を確認せずにコメントしました。私は、LiosKさんが最初に作ったバージョンの方がすべての桁が変更されるので、私であれば、LiosKさん独自実装がより良いと感じます。すっきりしました。ありがとうございます。
- 2008-11-05
- by katana
- id:uYRd4Z.Q
- 編集
-
最初のバージョンはUUID version 4の仕様に則ったもので、独自実装ではないです><
UUIDの生成方法は5種類あってそれぞれUUIDv1~v5の名前がついています><- 2008-11-05
- by LiosK
- id:-