UUID.js が UUID version 1 に対応しました

UUID.js が UUID version 1 に対応しました

[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)

[追記] UUID.js の最新版は CodeRepos に放流しました。

今までは UUID version 4 にしか対応していなかった UUID.js を、UUID version 1 にも対応させてみました。

UUID.js

使い方

使い方はやっぱり簡単。

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 を作るために作ったテストケースを公開しておこうかと思います。

uuidTest

テストケースでは、version 1 の UUID と version 4 の UUID をそれぞれ一万個ずつ生成して、次のことをチェックしています。

  1. 生成された文字列の長さが 36 になっているか
  2. ハイフンと十六進数字以外の文字が混ざっていないか
  3. ハイフンの位置は適切か
  4. version が正しくセットされているか
  5. variant が正しくセットされているか
  6. node 部の multicast/unicast フラグが multicast にセットされているか (version 1のみ)
  7. 生成された一万個の中に重複した ID がないか

それぞれのテストの意味は RFC 4122 を読んで調べてみてください。

見てわかるとおり、正しく一様な乱数が生成されているかどうかや、version 1 のタイムスタンプが適切にセットされているかどうかなどはノーチェックなので、がんばって目視でチェックするしかないです。

@todo

乱数生成アルゴリズムの改良

[急務] 32 ビット精度の乱数を合成して 48 ビットの良い乱数を作る方法がわからないよ><

乱数論とか文系の守備範囲外だよ><

RFC 1750 とか読んでも全然意味がわからないよ><

誰か教えて><

スポンサーサイト



関連記事

トラックバック 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:-

コメントの投稿

お名前
コメント
編集キー