こんにちは。きんくまです。
あるオブジェクトに番号をふりたくなりました。
それで、その番号は他のオブジェクトとはかぶりたくありません。
こういう場合DBだと、オートインクリメントにして、データを追加するたびに1ずつ増えていく数値型idを生成できます。
で、最初はこれを自作でやればいいのかなーと思ったのですが、管理が面倒だなと思いました。
1回ページを読み込んだときのみ、一時的にidを生成するだけだったらいいのですが、もしそいつをどこかに保存して、それを読み込むとなると管理が大変かなと。データを全て読み込んだあとに、次に生成するidは、読み込まれた全てのオブジェクトの中の一番大きいものにするとか。
で、そんなのはいやなので、ググったところ。こちらの記事が見つかりました。
>> How to create a GUID / UUID in Javascript?
JavaScriptなんですけど、AS3に直すのは簡単なので。
で、Kevin Hakansonさんのやり方にしてみました。
型情報を加えたり、s[19]のところで、parseIntを加えたりしたので(コンパイルで警告でちゃったので)手を少しだけ加えてあります。
/** * generate globally unique identifier * see * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript * * @retrun * generated GUID */ public function generateGUID():String { // http://www.ietf.org/rfc/rfc4122.txt var len:int = 36; var s:Vector.<String> = new Vector.<String>(len); var hexDigits:String = "0123456789abcdef"; for (var i:int = 0; i < len; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((parseInt(s[19], 10) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var guid:String = s.join(""); return guid; }
何をやってるのかはよくわかんないです、、。
生成されるidは
7d044301-93e9-4652-b355-4d2687e15038
というような形になります。
このまま使っていいものか不安だったので、テストしてみました。
ていうか、そのテストを書く方に時間がかかってしまった、、。案件のクラスが入っているので、コードは載せられないのですが、こんなふうにやりました。
要望
10000個のオブジェクトを作って、そのidがひとつもかぶらないことをテストしたい。
(実際には手動で画面クリックしてオブジェクトを作っていくので、ひとつのデータ内に20個もオブジェクトがあれば多い方という感じ)
10000個のオブジェクトを作って2重ループして比較しようとしたのですが、タイムアウトしました。時間かかるね!
なので、ある一定数チェックしたら、タイマーで休ませるようにしました。
するとものすごく時間がかかって、いつになったら終わるのかわかりません。
なので、1000個のオブジェクトを作って比較し、それを10セットやることで、のべ10000個のデータをチェックするようにしました。
うーん、のべ数で満たしていればそれでOKなのかわからないのだけどね、、、。
乱数使って同じデータではないと思うので、あってるのだと思うのだけど。イマイチ確証がないです。
ただ、のべ10000個のオブジェクトのidはかぶらずにいけました。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ