JavaScriptでユニークなID(GUIDやUUID)を生成する

JavaScriptでは、標準APIとしてUUIDを生成する関数は長らく用意されていませんでした。そのため、独自の実装を用いる必要があります(現在のモダンな開発環境ではより強固なIDを生成できます)

UUIDとは何か

UUID(Universally Unique Identifier)は、グローバルに一意な識別子を生成するためのフォーマットで、32桁の16進数から構成されます。UUID v4は、乱数をベースとした形式で、たとえば以下のような値になります:

3f2504e0-4f89-41d3-9a0c-0305e82c3301

実装例1:正規表現ベースのシンプルな関数

簡潔なUUIDでよければ、以下のように生成できます。

function generateUUID() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    const r = Math.random() * 16 | 0;
    const v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
}

この関数は、xyのプレースホルダーをランダムな16進数に置換することでUUIDを構成しています。4xxxの「4」はUUID v4であることを表し、yxxxの「y」はバージョンのバリエーションビットを指定しています。

実装例2:より堅牢なUUID生成

ES6以降の環境では、crypto.getRandomValues()を利用することで、より安全な乱数を用いたUUID生成が可能です。

function generateUUIDWithCrypto() {
  return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  );
}

この方式では、ブラウザが提供する暗号学的に強い乱数を活用するため、セキュリティ上の要求が高い場面においても安心して利用できます。

なぜ[018]を対象にしているのか

この実装では、プレースホルダーとして 018 の数字に限定してランダムなビット操作を行うことで、フォーマットに沿ったUUIDを生成しています。c ^ ... のビット演算により、対象文字を16進文字にランダム変換している点が特徴です。

互換性と利用環境

この手法は、モダンなブラウザであれば広く対応しています。

Node.jsでのUUID生成

Node.js環境では、標準モジュールであるcryptoが提供する randomUUID() 関数を利用することで、UUID v4を簡単に生成できます(Node.js v14.17以降)。

const { randomUUID } = require('crypto');
console.log(randomUUID());

この方法は、Node.jsアプリケーションにおいて公式なUUID生成手段として推奨されます。

注意点

  • 簡易な関数は十分なユニーク性を持ちますが、完全なセキュリティが求められる場合は crypto ベースの実装が推奨されます。
  • ブラウザ環境とNode.js環境で利用できるAPIが異なるため、用途に応じた実装を選ぶことが重要です。

まとめ

JavaScriptでUUIDを生成する方法はいくつかありますが、使用する環境やセキュリティ要件に応じて適切な手法を選択することが重要です。ランダム性の質が問われない場合はシンプルな関数で十分ですが、高度な一意性が求められる場合は crypto.getRandomValues() や Node.jsの crypto.randomUUID() を使うのがいいですね。