nanoid vs randomstring vs shortid vs uuid
フロントエンドアプリケーションにおける一意な識別子生成ライブラリの選定
nanoidrandomstringshortiduuid類似パッケージ:

フロントエンドアプリケーションにおける一意な識別子生成ライブラリの選定

nanoidrandomstringshortiduuid はいずれも JavaScript 環境で一意な文字列を生成するための npm パッケージですが、目的や設計思想、API、セキュリティ特性が大きく異なります。uuid は RFC 4122 準拠の汎用的な UUID を生成し、nanoid は極小サイズかつ高速な短い ID を目指します。randomstring は柔軟なカスタマイズ可能なランダム文字列生成に特化し、shortid はかつて人気のあった短い非衝突 ID 生成器でしたが、現在は非推奨となっています。これらのパッケージは、データベースの主キー、一時トークン、URL ショートナー、セッション ID など、さまざまなユースケースで使われますが、適切な選択はアプリケーションの要件に大きく依存します。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
nanoid026,75713.6 kB213分前MIT
randomstring052316.6 kB21年前MIT
shortid05,71621.7 kB161年前MIT
uuid015,26670.3 kB111日前MIT

一意な ID 生成ライブラリ徹底比較: nanoid vs randomstring vs shortid vs uuid

フロントエンド開発で「一意な文字列」が必要になる場面は多いです。例えば、リストの各アイテムに key を付ける、一時的なセッション ID を生成する、URL ショートナーを作るなど。しかし、Math.random().toString(36) で済ませるのは危険です。衝突リスクやセキュリティの問題があります。

この記事では、代表的な ID 生成ライブラリである nanoidrandomstringshortiduuid を、実際の開発観点から深く比較します。それぞれの強み・弱点をコード付きで解説し、あなたのプロジェクトに最適な選択をサポートします。

⚠️ まず確認:非推奨パッケージの存在

shortid は公式に非推奨(deprecated)されています。npm ページおよび GitHub リポジトリに明確な警告が記載されており、新しいプロジェクトでの使用は推奨されません。理由は以下の通りです:

  • Math.random() に依存しており、暗号論的に安全ではない
  • 短い文字列ゆえに衝突確率が高く、スケールすると問題が顕在化
  • 開発が停止されており、バグ修正や改善が行われていない
// ❌ shortid — 新規プロジェクトでは絶対に使わないでください
import shortid from 'shortid';
const id = shortid.generate(); // 例: "23aBc"

代わりに、nanoiduuid を検討してください。以下では 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 表示にも影響します。

パッケージデフォルト長さ文字セット
nanoid21 文字-._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() の質が低いので実効エントロピーは低い

実用上、nanoiduuid はどちらも大規模システムで十分な安全性を持ちますが、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軽量、安全、短い
認証トークン、セッション IDnanoidCSPRNG 使用、安全
バックエンドと UUID を共有したいuuid標準準拠、相互運用性
テストデータやパスワード生成randomstringフォーマット自由(※安全でないことに注意)
URL ショートナーの短いコードnanoidURL セーフ、衝突確率低
新規プロジェクトでの shortid 使用禁止非推奨、安全でない

💡 最終アドバイス

  • セキュリティが関わるなら nanoiduuid:迷ったら nanoid がフロントエンド向けに最適です。
  • フォーマットの自由度が必要なら randomstring:ただし、安全でないことを理解した上で、非セキュリティ用途に限定してください。
  • shortid は即座に置き換えを検討:既存コードにあれば、nanoid への移行は簡単です(API が似ているため)。

正しい ID 生成ライブラリを選ぶことで、アプリケーションの信頼性とセキュリティを大きく向上させることができます。安易な Math.random() からの脱却を、ぜひこの機会に。

選び方: nanoid vs randomstring vs shortid vs uuid

  • nanoid:

    nanoid は、バンドルサイズを最小限に抑えつつ、高速かつ安全な短い ID を必要とするフロントエンドプロジェクトに最適です。URL セーフで衝突確率が低く、CSP(Content Security Policy)環境でも動作します。特にモダンなビルドツール(Vite、Webpack など)と相性が良く、軽量さと安全性のバランスが取れた選択肢です。

  • randomstring:

    randomstring は、特定の文字セット(例:英数字のみ、記号なし)、長さ、パターンに基づいて完全にカスタマイズ可能なランダム文字列を生成したい場合に適しています。パスワード生成やテストデータ作成など、ID の一意性よりもフォーマットの柔軟性が重要な場面で有用ですが、暗号論的に安全な乱数生成には対応していません。

  • shortid:

    shortid は公式に非推奨(deprecated)とされており、新しいプロジェクトでは使用すべきではありません。衝突リスクが高く、暗号論的に安全でない Math.random() に依存しているため、セキュリティ上問題があります。既存コードで使用されている場合は、nanoid または uuid への移行を強く推奨します。

  • uuid:

    uuid は、業界標準の UUID(バージョン 1~5、および v7/v8)を生成する必要がある場合に最適です。特にバックエンドシステムやデータベースとの互換性が求められる場合や、グローバルな一意性が必須な分散システムで信頼性が高い選択肢です。ただし、生成される文字列は比較的長く(36文字)、フロントエンドでの軽量利用にはオーバーヘッドが大きい場合があります。

nanoid のREADME

Nano ID

Nano ID logo by Anton Lovchikov

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.”

  • Small. 118 bytes (minified and brotlied). No dependencies. Size Limit controls the size.
  • Safe. It uses hardware random generator. Can be used in clusters.
  • Short IDs. It uses a larger alphabet than UUID (A-Za-z0-9_-). So ID size was reduced from 36 to 21 symbols.
  • Portable. Nano ID was ported to over 20 programming languages.
import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"

  Made at Evil Martians, product consulting for developer tools.


Docs

Read full docs here.