nanoid、uuid、short-uuid、shortid は、JavaScript アプリケーションで一意の識別子を生成するためのライブラリです。uuid は RFC 4122 標準に準拠した伝統的な選択肢であり、システム間連携で広く採用されています。nanoid はより小さく高速で URL セーフな現代的な代替案として登場しました。short-uuid は UUID を短縮するために使用されます。一方、shortid はセキュリティ上の問題により非推奨となっており、新しいプロジェクトでの使用は避けるべきです。
nanoid と uuid は、JavaScript アプリケーションで一意の識別子を作成するための代表的なライブラリですが、設計思想と使用场景が異なります。short-uuid は UUID を短縮するラッパーであり、shortid は非推奨の古いライブラリです。実務で正しい選択をするために、技術的な違いを詳しく比較します。
nanoid はデフォルトで暗号学的に安全な乱数生成器を使用します。
crypto.getRandomValues を利用します。// nanoid: 暗号学的に安全な ID 生成
import { nanoid } from 'nanoid';
const id = nanoid();
// 例: "V1StGXR8_Z5jdHi6B-myT"
uuid (v4) も暗号学的な乱数を使用しますが、実装に依存します。
nanoid に比べて文字列が長くなります。// uuid: 標準的な UUID v4 生成
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();
// 例: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
short-uuid は uuid をベースにしているため、元々の安全性を継承します。
uuid を生成し、それをエンコードして短くします。uuid に準拠しますが、変換プロセスが入ります。// short-uuid: UUID を短縮して生成
import short from 'short-uuid';
const id = short.generate();
// 例: "4Wq9Z8y7X6v5U4t3S2r1"
shortid は乱数生成の品質に問題があり、非推奨です。
// shortid: 非推奨(使用しないでください)
import shortid from 'shortid';
const id = shortid.generate();
// 例: "P1ckZ"
nanoid は URL セーフな文字のみを使用します。
_、- のみで構成されます。// nanoid: URL セーフな形式
const url = `https://api.example.com/users/${nanoid()}`;
// エンコード不要で安全に使用可能
uuid はハイフンを含み、URL エンコードが必要な場合があります。
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx です。// uuid: ハイフンを含む形式
const id = uuidv4();
const urlSafeId = id.replace(/-/g, ''); // 手動で除去が必要な場合あり
short-uuid は UUID を Base58 などでエンコードするため URL セーフです。
nanoid に劣ることがあります。// short-uuid: 短縮された URL セーフ形式
const id = short.generate();
// 標準 UUID より短く、URL 埋め込みに適している
shortid は URL セーフな文字を使用しますが、前述の通り非推奨です。
// shortid: 形式は URL セーフだが非推奨
const id = shortid.generate();
// 技術的な形式より、保守性の問題が大きい
shortid は公式に非推奨(Deprecated)となっています。
// ❌ 非推奨:shortid
// 新しいプロジェクトでは使用しないでください
import shortid from 'shortid';
nanoid は shortid の公式な後継として推奨されています。
// ✅ 推奨:nanoid
// shortid の代わりにこちらを使用
import { nanoid } from 'nanoid';
uuid と short-uuid は標準仕様に基づくため、長期安定性があります。
// ✅ 安定:uuid
// 標準準拠が必要な場合に使用
import { v4 } from 'uuid';
これらライブラリは、いくつかの基本的な点で共通しています。
await 不要でシンプルに呼び出せます。// すべて同期で ID を生成可能
const id1 = nanoid();
const id2 = uuidv4();
const id3 = short.generate();
// どちらの環境でも動作する
import { nanoid } from 'nanoid';
// ブラウザでも Node.js でも利用可能
nanoid と uuid はカスタムアルファベットやバージョンを選択できます。// nanoid: カスタムアルファベット
import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('1234567890abcdef', 10);
// uuid: バージョン選択
import { v1, v4 } from 'uuid';
| 機能 | nanoid | uuid | short-uuid | shortid |
|---|---|---|---|---|
| 推奨度 | ✅ 強く推奨 | ✅ 標準要件あり | ⚠️ 特殊要件 | ❌ 非推奨 |
| URL セーフ | ✅ はい | ❌ ハイフンあり | ✅ はい | ✅ はい |
| 文字列長 | 短い (21 文字) | 長い (36 文字) | 非常に短い | 短い |
| 安全性 | ✅ 暗号学的 | ✅ 暗号学的 | ✅ 暗号学的 | ⚠️ 問題あり |
| 標準準拠 | ❌ 独自形式 | ✅ RFC 4122 | ✅ (元は UUID) | ❌ 独自形式 |
nanoid は現代的なフロントエンド開発におけるデフォルトの選択肢です 🧰。URL セーフで短く、安全性も保証されているため、ほとんどのケースで最適です。
uuid は既存システムとの互換性が最優先される場合に使用します 🔧。RFC 標準が絶対要件であるバックエンド連携などで役立ちます。
shortid は技術的負債となるため、避けるべきです 🚫。セキュリティと保守性の観点から、移行が必須です。
最終的なアドバイス: 特別な形式要件がない限り nanoid を採用し、標準 UUID が必要な場合のみ uuid を選択してください。
基本的な ID 生成には nanoid を選択します。URL セーフで衝突リスクが低く、バンドルサイズも小さいため、フロントエンド開発において最もバランスが取れています。特にクライアント側で ID を生成するケースや、URL に ID を埋め込む場合に最適です。
UUID の論理構造は必要だが、文字列長を短くしてデータベースキーや URL に埋め込みたい場合に short-uuid を選択します。標準 UUID の長さが高コストになるストレージ環境などで検討されます。
shortid は公式に非推奨であり、セキュリティ上の脆弱性が報告されています。新しいプロジェクトでは絶対に使用せず、既存プロジェクトでも nanoid へ移行してください。維持管理のリスクが高すぎます。
既存のバックエンドシステムやデータベースが RFC 4122 標準の UUID 形式を厳密に要求する場合にのみ uuid を選択します。ハイフンを含む形式が要件となっている古いシステムとの互換性が必要な場面などで役立ちます。
English | 日本語 | Русский | 简体中文 | Bahasa Indonesia | 한국어 | العربية
A tiny, secure, URL-friendly, unique string ID generator for JavaScript.
“An amazing level of senseless perfectionism, which is simply impossible not to respect.”
A-Za-z0-9_-).
So ID size was reduced from 36 to 21 symbols.import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"
Made at Evil Martians, product consulting for developer tools.
Read full docs here.