nanoid、randomstring、shortid、uuid はいずれも JavaScript 環境で一意な文字列を生成するための npm パッケージですが、目的や設計思想、API、セキュリティ特性が大きく異なります。uuid は RFC 4122 準拠の汎用的な UUID を生成し、nanoid は極小サイズかつ高速な短い ID を目指します。randomstring は柔軟なカスタマイズ可能なランダム文字列生成に特化し、shortid はかつて人気のあった短い非衝突 ID 生成器でしたが、現在は非推奨となっています。これらのパッケージは、データベースの主キー、一時トークン、URL ショートナー、セッション ID など、さまざまなユースケースで使われますが、適切な選択はアプリケーションの要件に大きく依存します。
フロントエンド開発で「一意な文字列」が必要になる場面は多いです。例えば、リストの各アイテムに key を付ける、一時的なセッション ID を生成する、URL ショートナーを作るなど。しかし、Math.random().toString(36) で済ませるのは危険です。衝突リスクやセキュリティの問題があります。
この記事では、代表的な ID 生成ライブラリである nanoid、randomstring、shortid、uuid を、実際の開発観点から深く比較します。それぞれの強み・弱点をコード付きで解説し、あなたのプロジェクトに最適な選択をサポートします。
shortid は公式に非推奨(deprecated)されています。npm ページおよび GitHub リポジトリに明確な警告が記載されており、新しいプロジェクトでの使用は推奨されません。理由は以下の通りです:
Math.random() に依存しており、暗号論的に安全ではない// ❌ shortid — 新規プロジェクトでは絶対に使わないでください
import shortid from 'shortid';
const id = shortid.generate(); // 例: "23aBc"
代わりに、nanoid や uuid を検討してください。以下では shortid を比較対象から外し、残り3つを詳細に見ていきます。
ID 生成で最も重要なのは「予測不可能性」です。特にトークンやセッション ID など、セキュリティに直結する用途では、Math.random() のような擬似乱数ではなく、暗号論的に安全な乱数生成器(CSPRNG) を使う必要があります。
nanoid:デフォルトで安全nanoid は、Node.js では crypto.randomBytes、ブラウザでは crypto.getRandomValues を内部で使用します。つまり、デフォルトで CSPRNG を利用し、安全です。
// ✅ nanoid — 安全で短い ID
import { nanoid } from 'nanoid';
const id = nanoid(); // 例: "V1StGXR8_Z5jdHi6B-myT"
さらに、CSP(Content Security Policy)環境でも動作するよう、globalThis.crypto を直接参照する設計になっています。
uuid:UUID 標準に準拠uuid も同様に、v4(ランダムベース)では CSPRNG を使用します。RFC 4122 標準に準拠しており、業界で広く受け入れられています。
// ✅ uuid — 標準的で安全
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4(); // 例: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
randomstring:安全ではない一方、randomstring は 暗号論的に安全な乱数をサポートしていません。内部で Math.random() を使用しており、予測可能で衝突リスクも高いため、セキュリティ関連の用途には不向きです。
// ⚠️ randomstring — 安全ではない(Math.random() 使用)
import randomstring from 'randomstring';
const token = randomstring.generate(32); // 危険!セッションIDなどに使わないこと
💡 ポイント:セキュリティが関わる用途(認証トークン、パスワードリセットリンクなど)では、
randomstringは絶対に使わないでください。
生成される ID の長さは、ネットワーク転送量や UI 表示にも影響します。
| パッケージ | デフォルト長さ | 文字セット |
|---|---|---|
nanoid | 21 文字 | -._0-9A-Za-z(URL セーフ) |
uuid (v4) | 36 文字 | 0-9a-f-(ハイフン含む) |
randomstring | 指定可能 | カスタマイズ可能(デフォルトは英数字) |
nanoid は非常にコンパクトで、URL や HTTP ヘッダーに埋め込んでも負担が少ないです。uuid は長さが固定で可読性が高いですが、頻繁に送受信するデータではオーバーヘッドになります。
// 長さ比較
nanoid(); // "KTxH1iZQeF3qJxN8yLmPw" (21)
uuidv4(); // "f47ac10b-58cc-4372-a567-0e02b2c3d479" (36)
randomstring.generate(10); // "x9gF2kLmQp" (任意)
randomstring:柔軟なフォーマット制御randomstring の最大の強みは、生成ルールを細かく指定できることです。
// ✅ randomstring — フォーマットを自由に設定
import randomstring from 'randomstring';
// 英数字のみ、10文字
randomstring.generate({ length: 10, charset: 'alphanumeric' });
// 数字のみ
randomstring.generate({ length: 6, charset: 'numeric' });
// 特定の文字セット
randomstring.generate({ length: 8, charset: 'ABCDEF1234567890' });
このような柔軟性は、パスワード生成やテストデータ作成など、ID の一意性よりも「見た目」や「形式」が重要な場面で役立ちます。
nanoid:カスタムアルファベット対応nanoid もカスタム文字セットに対応していますが、API はより低レベルです。
// ✅ nanoid — カスタムアルファベット
import { customAlphabet } from 'nanoid';
const generateId = customAlphabet('1234567890abcdef', 10);
const id = generateId(); // 例: "a3f9b1c8e2"
ただし、これは依然として CSPRNG を使用するため、randomstring よりも安全です。
uuid:フォーマットは固定uuid は標準に従うため、文字セットや長さのカスタマイズはできません。ただし、ハイフンを除去するなど、後処理は可能です。
// uuid — 後処理で短縮
const compactUuid = uuidv4().replace(/-/g, ''); // 32文字
理論的な衝突確率は、ID のエントロピー(情報量)に依存します。
nanoid(21文字、64文字セット):約 126 ビットのエントロピーuuid v4(122ビットのランダム部分):122 ビットのエントロピーrandomstring(デフォルト32文字、62文字セット):約 190 ビットだが、Math.random() の質が低いので実効エントロピーは低い実用上、nanoid と uuid はどちらも大規模システムで十分な安全性を持ちますが、randomstring は衝突リスクが高いため、大量の ID を生成する用途には向いていません。
nanoid:軽量でモダン環境に最適nanoid はバンドルサイズが極めて小さく(1KB未満)、ESM/CJS の両方をサポートしています。Vite や Webpack との相性も抜群です。
// Vite / React での使用例
import { nanoid } from 'nanoid';
function TodoList() {
const [todos, setTodos] = useState([]);
const addTodo = (text) => {
setTodos([...todos, { id: nanoid(), text }]);
};
}
uuid:安定した選択肢uuid もフロントエンドで問題なく動作しますが、nanoid よりも若干重いです。ただし、多くのバックエンドシステムと互換性があるため、フルスタックで統一したい場合に有利です。
randomstring:Node.js 向けの印象が強いrandomstring はブラウザでも動作しますが、ドキュメントや設計が Node.js ファーストであり、フロントエンドでの利用事例は少ないです。
| ユースケース | 推奨パッケージ | 理由 |
|---|---|---|
React/Vue のリスト key 生成 | nanoid | 軽量、安全、短い |
| 認証トークン、セッション ID | nanoid | CSPRNG 使用、安全 |
| バックエンドと UUID を共有したい | uuid | 標準準拠、相互運用性 |
| テストデータやパスワード生成 | randomstring | フォーマット自由(※安全でないことに注意) |
| URL ショートナーの短いコード | nanoid | URL セーフ、衝突確率低 |
| 新規プロジェクトでの shortid 使用 | 禁止 | 非推奨、安全でない |
nanoid か uuid:迷ったら nanoid がフロントエンド向けに最適です。randomstring:ただし、安全でないことを理解した上で、非セキュリティ用途に限定してください。shortid は即座に置き換えを検討:既存コードにあれば、nanoid への移行は簡単です(API が似ているため)。正しい ID 生成ライブラリを選ぶことで、アプリケーションの信頼性とセキュリティを大きく向上させることができます。安易な Math.random() からの脱却を、ぜひこの機会に。
nanoid は、バンドルサイズを最小限に抑えつつ、高速かつ安全な短い ID を必要とするフロントエンドプロジェクトに最適です。URL セーフで衝突確率が低く、CSP(Content Security Policy)環境でも動作します。特にモダンなビルドツール(Vite、Webpack など)と相性が良く、軽量さと安全性のバランスが取れた選択肢です。
randomstring は、特定の文字セット(例:英数字のみ、記号なし)、長さ、パターンに基づいて完全にカスタマイズ可能なランダム文字列を生成したい場合に適しています。パスワード生成やテストデータ作成など、ID の一意性よりもフォーマットの柔軟性が重要な場面で有用ですが、暗号論的に安全な乱数生成には対応していません。
shortid は公式に非推奨(deprecated)とされており、新しいプロジェクトでは使用すべきではありません。衝突リスクが高く、暗号論的に安全でない Math.random() に依存しているため、セキュリティ上問題があります。既存コードで使用されている場合は、nanoid または uuid への移行を強く推奨します。
uuid は、業界標準の UUID(バージョン 1~5、および v7/v8)を生成する必要がある場合に最適です。特にバックエンドシステムやデータベースとの互換性が求められる場合や、グローバルな一意性が必須な分散システムで信頼性が高い選択肢です。ただし、生成される文字列は比較的長く(36文字)、フロントエンドでの軽量利用にはオーバーヘッドが大きい場合があります。
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.