[Javascript]UUIDを乱数で作りたいって、あんたが勝手に作ればよ!

Pocket

やりたいことあるなら自分で勝手にやればいいのに、口だけは偉そうで実際には何にもできないお荷物が騒いでいます。どうせ、UUIDとかも必要ないにもかかわらず、作りたいって言ってることは予想できます。

まあ、作りたい理由なんて聞きもしませんが。曖昧でわけわからないこと言われて、相手するだけ損なの知ってますから。

スポンサーリンク

UUIDって何?

ウィキペディアによると、こうあります。

UUID(Universally Unique Identifier)とは、ソフトウェア上でオブジェクトを一意に識別するための識別子である。

https://ja.wikipedia.org/wiki/UUID

例えば、MACアドレスも世界中で一意になっていますから、考え方は同じようなもののようです。

で、UUIDの作り方もいくつかあるようですが、その中の1つに、乱数を使ってUUIDを作る方法があるようです。その時の、UUIDは以下のフォーマットになります。

xxxxxxxx-xxxx-4xxx-Zxxx-xxxxxxxxxxxx

  • 1文字あたり4ビット使用
  • 8文字-4文字-4文字-4文字-12文字のフォーマット
  • x:0~fのいずれかを乱数で生成(16進数表記)
  • 4:バージョン情報で4固定(2進数では、0100)
  • Z:8, 9 , a , b(16進数表記)Zの上位2ビットは ’10’ と決められているため、残りの2ビットと組み合わせて作れるのが、これらの文字となる(2ビット分は乱数で生成)

JavascriptでUUIDを作ってみる

リンク先のページにあったコードに説明を加えたものになります。諸所の事情で一部改悪風な修正も入れてあります。🙇
https://qiita.com/psn/items/d7ac5bdb5b5633bae165

function getUUID() {
    // UUIDのフォーマット文字列を配列に格納
    var uuid = "xxxxxxxx-xxxx-4xxx-Zxxx-xxxxxxxxxxxx".split("");
    var len = uuid.length;
    for (var i = 0; i < len; i++) {
        switch (uuid[i]) {
            case "4":  // 何もしない(変更なし)
                break;
            case "-": // 何もしない(変更なし)
                break;
            case "x":
                /*
                 * 0 ≦ Math.random() < 1 なので、16をかけると
                 * 0 ~ 15.xxx(16未満) となり、小数部を切り捨てて数値 0 ~ 15 を
                 * 16進数の文字にしている(0 ~ f となる)
                 */
                uuid[i] = Math.floor(Math.random() * 16).toString(16);
                break;
            case "Z":
           /* 
                 * 同じく、 0 ~ 3.xxx(4未満) の小数部を切り捨てて、8を加えると
                 * 8 ~ 11 の範囲の値となるので、それを16進数の文字にしている
                 * (8, 9, a, b のいずれかになる)
                 */
                uuid[i] = (Math.floor(Math.random() * 4) + 8).toString(16);
                break;
        }
    }
    // 配列を結合して1つの文字列に変換
    return uuid.join("");
}

/* 
 * もしも、同じ文字列が出力されたとすると、
 * あなたが世界最強の引きの強さを持っているか
 * 本サンプルがバグっているかのいずれかだと思います。
 */
console.log(getUUID()); 
console.log(getUUID()); 
console.log(getUUID());

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *