JavaScriptでUUID(v4)してみただけ

はじめに

上記記事を見てたらうずうずしてきたので。

UUIDとは

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

ということで、バッティングしないIDのことです。
(正確には、途方もない数生成しない限りバッティングする確率を考えなくてもよいようなIDのこと)。

JavaScriptでの実装

上記記事では以下のようになっています。

function generateUuid() {  
    // https://github.com/GoogleChrome/chrome-platform-analytics/blob/master/src/internal/identifier.js  
    // const FORMAT: string = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";  
    let chars = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("");  
    for (let i = 0, len = chars.length; i < len; i++) {  
        switch (chars[i]) {  
            case "x":  
                chars[i] = Math.floor(Math.random() * 16).toString(16);  
                break;  
            case "y":  
                chars[i] = (Math.floor(Math.random() * 4) + 8).toString(16);  
                break;  
        }  
    }  
    return chars.join("");  
}  

forは早いのでこういったライブラリなどの速度が求められる場面では積極的に用いるべきです。

…が、どうしても気になってしまって仕方がない…。ので書き換えていきます。

for-of使おうぜ

const generateUuid = () => {  
    const chars = [];  
    for (const char of 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx') {  
        switch (char) {  
            case 'x':  
                chars.push(Math.floor(Math.random() * 16).toString(16));  
                break;  
            case 'y':  
                chars.push((Math.floor(Math.random() * 4) + 8).toString(16));  
                break;  
            default:  
                chars.push(char);  
                break;  
        }  
    }  
    return chars.join('');  
};  

reduceしようぜ

const generateUuid = () => {  
    return [...'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'].reduce((acc, cur) => {  
        switch (cur) {  
            case 'x':  
                acc += Math.floor(Math.random() * 16).toString(16);  
                break;  
            case 'y':  
                acc += (Math.floor(Math.random() * 4) + 8).toString(16);  
                break;  
            default:  
                acc += cur;  
                break;  
        }  
        return acc;  
    }, '');  
};  

三項演算子も使っちゃおうぜ

const generateUuid = () => {  
    return [...'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'].reduce((acc, cur) => {  
        acc +=  
            cur === 'x' ? Math.floor(Math.random() * 16).toString(16) :  
            cur === 'y' ? (Math.floor(Math.random() * 4) + 8).toString(16) :  
            cur  
            ;  
        return acc;  
    }, '');  
};  

…これ…replaceのがよくね?

const generateUuid = () => {  
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'  
        .replace(/x/g, () => Math.floor(Math.random() * 16).toString(16))  
        .replace(/y/g, () => (Math.floor(Math.random() * 4) + 8).toString(16))  
        ;  
};  

おわりに

できる限り短くしました。ご査収ください。

const generateUuid=($=(a,b)=>(Math.floor(Math.random()*a)+b).toString(16))=>'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/x/g,_=>$(16,0)).replace(/y/g,_=>$(4,8));  

速度? んなもん知らねぇ!