[JavaScript] UUID.js を更新しました!
- 2010-07-27
- カテゴリ: Client Side
- タグ: JavaScript UUID アルゴリズム
以前公開したまま放置していたJavaScript用のUUID生成ライブラリ、UUID.jsの最新バージョンを公開しました!
大幅な機能追加とバグ修正が行われて、ホスティング先もCodeReposからGitHubに変更されました!
LiosK's UUID.js at master - GitHub
UUID.js: The RFC-compliant UUID generator for JavaScript.
↓こんな感じのRFC 4122に準拠したUUIDをJavaScriptで簡単に生成することができます!
368606ed-98b5-11df-8fd2-0ba59ea365b9
UUIDは大量に生成しても重複が起きないように工夫されているので、中央で統制を取らなくとも一意のIDを生成できて何かと便利です!
使用例や動作サンプルは続きで!
UUID.jsパッケージの入手
GitHubリポジトリのDownloadsページから最新の安定板を入手します。
単純な使用例
最も単純な使い方は、旧バージョンのUUID.jsと同様に、uuid.jsをロードしてUUID.generate()
メソッドを呼び出すだけです。
- 1. uuid.jsのロード
<script type="text/javascript" src="uuid.js"></script>
- 2.
UUID.generate()
メソッドの実行 -
window.alert(UUID.generate()); //
- サンドボックス
-
UUIDオブジェクトの使用
今回のバージョンアップの最大の特徴は、UUIDの細かい情報にアクセスするためのUUIDオブジェクトの実装です。
↓のメソッドでUUIDオブジェクトを生成します。
// Version 4 UUID (乱数ベースのUUID) オブジェクトを生成 var objV4 = UUID.genV4(); // Version 1 UUID (タイムスタンプベースのUUID) オブジェクトを生成 var objV1 = UUID.genV1(); // UUID文字列からUUIDオブジェクトを生成 var parsed = UUID.parse("a0e0f130-8c21-11df-92d9-95795a3bcd40");
↓UUIDオブジェクトからさまざまな文字列表現を取り出します。
var uuid = UUID.genV1(); window.alert(uuid.hexString); // 16進法文字列 window.alert(uuid.bitString); // 2進法文字列 window.alert(uuid); // toString() メソッド window.alert(uuid.urn); // URN文字列表現
↓UUIDの比較。
var lft = UUID.parse("e9469917-719f-44c4-84ba-77f97bae3ed3"), rgt = UUID.parse("urn:uuid:E9469917-719F-44C4-84BA-77F97BAE3ED3"); window.alert(lft.equals(rgt)); //
↓UUIDの各フィールドへアクセス。
var uuid = UUID.parse("9a99f17b-032f-47a5-ba82-92ae1b488b70"); // 各UUIDフィールドを16進法文字列の配列として取得 window.alert(uuid.hexFields.join(", ")); // // 2進法文字列の配列で window.alert(uuid.bitFields.join(", ")); // // 数値型の配列で window.alert(uuid.intFields.join(", ")); // // 各UUIDフィールドをフィールド名で取得 window.alert(uuid.intFields.timeLow); // window.alert(uuid.bitFields.timeMid); // window.alert(uuid.hexFields.timeHiAndVersion); // window.alert(uuid.intFields.clockSeqHiAndReserved); // window.alert(uuid.bitFields.clockSeqLow); // window.alert(uuid.hexFields.node); //
ライセンスとドキュメント
ライセンスはMITライセンスです。どんどん使っちゃってください!
ライセンスの全文と簡単な使用例はREADMEに記載してあります。それとは別に、JsDoc Toolkitで生成したAPIリファレンスも用意してあります。
Version 1 UUIDとVersion 4 UUIDの使い分け
何回か↓の「生成」ボタンを押してみればわかるように、Version 1 UUIDとVersion 4 UUIDとでは少々勝手が違います。
- Version 1 UUID
- 0fc9e7b8-98bf-11df-ad59-f3b30a3727f1
- Version 4 UUID
- 78a67435-2655-4f29-919f-a35f5d40e34c
Version 4 UUIDは乱数ベースのUUIDで、予約ビットを除いた全てのビット (122ビット) がランダムで選ばれます。乱数部が十分に長いので、重複したUUIDが生成される可能性が低くなるという仕組みになっています。
一方のVersion 1 UUIDはタイムスタンプベースのUUIDで、現在のタイムスタンプとマシン固有のノードID (通常はネットワークカードのMACアドレス) を組み合わせて生成されています。従って、生成した時点でのタイムスタンプが異なれば必ず違うUUIDが生成され、また、生成するマシンが異なれば必ず違うUUIDが生成される仕組みになっています。
JavaScriptでは取得できないMACアドレスの代わりとして、UUID.jsではロード時に初期化される47ビットの乱数をノードIDとして使用しているので、「マシンが異なれば必ず違うUUIDが…」とは言えませんが、タイムスタンプをミリ秒単位で一致させた上で65ビットの乱数を一致させない限り重複したUUIDは生成されないような実装になっているので、ほぼ安心することができます。
通常の用途ではVersion 4 UUIDで特に問題はなくて、Version 1 UUIDの出番はあまりないでしょう。一つのブラウザの一つのページで大量にUUIDを生成する場合などはVersion 1 UUIDの方が重複の可能性を低くすることができるので向いています。
後方互換性
以前公開したUUID.jsのVersion 2では、UUID.generate
メソッドは引数に{ version: 1 }
を渡すとVersion 1 UUIDを生成する仕様になっていましたが、今回のリリースでは引数の有無に関わらずVersion 4 UUIDを生成する仕様になりました↓。
window.alert(UUID.generate()); // "c88217ec-ab55-4bd4-bbb9-3c5b29ac8635" window.alert(UUID.generate({ version: 1 })); // "1e6de9d0-9ca3-409b-b3c7-524f74a84007"
ほとんどの場合、この仕様変更で影響を受けることはないと思いますが、念のため過去のインターフェースをエミュレートするためのメソッドを用意しておきました↓。
UUID.makeBackwardCompatible(); window.alert(UUID.generate()); // "f3a35c74-1bc3-44e2-ba33-34c29d5ebc2a" window.alert(UUID.generate({ version: 1 })); // "b0c7d3fc-997a-11df-b8ac-231893446988"
目立たない機能強化
- 乱数の強化
- 以前書いたJavaScriptの乱数精度に関する記事を踏まえた乱数生成関数を使うようにしたので、旧バージョンのUUID.jsよりも質の良いUUIDを生成するようになっています。
- パフォーマンスの改善
- 微々たるものながら
UUID.generate
メソッドが高速化されています。Firefoxでは旧バージョンの2倍弱のスピードになっています。 - タイムスタンプ精度の補間
- JavaScriptのタイムスタンプの精度とUUIDで求められるタイムスタンプの精度との間には10000倍の開きがあります。この精度不足を乱数で補間するように実装したので、旧バージョンのUUID.jsや他のJavaScript UUID実装と比較しても質の高いVersion 1 UUIDを生成するようになっています。
- テストの充実
- テストケースを増やしてしっかりとテストをしています。
今後の課題
- Version 3, 5 UUIDの実装 (ちょっと難しそうだけど)
- DCE準拠UUIDの実装 (これは簡単そう)
- UUIDオブジェクトの強化 (どんな機能が必要だろう?)
- テストケースとドキュメントの充実
関連記事
- コマンドを起動して一定時間後にタイムアウト終了させるコマンドを作りました
- Finance::Quote::YahooJapanを更新しました!
- [JavaScript] UUID.js を更新しました!
- [JavaScript] newは大事だよ!
- [メモ] Xubuntuでおひとり様サーバーを立てるまで 2
トラックバック URL
- http://liosk.blog103.fc2.com/tb.php/203-177dddff