UUIDより短いユニークなIDを生成できるnpmライブラリnanoidの使い方
nanoidは、セキュアで短く、URLセーフな一意の文字列IDを簡単に生成できるnpmライブラリです。
UUIDに比べて文字数が少なく、扱いやすい形式であることから、多くのJavaScript/TypeScriptプロジェクトで重宝されています。
公式リポジトリ:ai/nanoid
UUIDとの違い
UUID(特にv4)は広く利用される識別子ですが、以下のような違いがあります。
| 特性 | UUID v4 | nanoid |
|---|---|---|
| 長さ | 32文字(ハイフン含めると36文字) | デフォルト21文字(変更可能) |
| 文字種 | 16進数(a-f, 0-9) | A-Za-z0-9_-(URLセーフ) |
| URLセーフ | △(エンコードが必要) | ○ |
| セキュリティ | 高(暗号論的乱数) | 高(crypto.randomBytesに準拠) |
| カスタマイズ性 | × | ○(文字列セットや長さを指定可能) |
nanoidは短さ、URLとの親和性、使いやすさにおいて明確な利点があります。
特にフロントエンドやAPIレスポンスの軽量化に寄与します。
パフォーマンス比較(Benchmark)
zsh$ node ./test/benchmark.js
crypto.randomUUID 21,119,429 ops/sec
uuid v4 20,368,447 ops/sec
@napi-rs/uuid 11,493,890 ops/sec
uid/secure 8,409,962 ops/sec
@lukeed/uuid 6,871,405 ops/sec
nanoid 5,652,148 ops/sec
customAlphabet 3,565,656 ops/sec
secure-random-string 394,201 ops/sec
uid-safe.sync 393,176 ops/sec
shortid 49,916 ops/sec
Async:
nanoid/async 135,260 ops/sec
async customAlphabet 136,059 ops/sec
async secure-random-string 135,213 ops/sec
uid-safe 119,587 ops/sec
Non-secure:
uid 58,860,241 ops/sec
nanoid/non-secure 2,744,615 ops/sec
rndm 2,718,063 ops/sec
一見uuidのほうが高速に見えますが、nanoidは文字数が短く、サイズ・パフォーマンスのトレードオフを許容できる場面では非常に有効です。
ユースケース
クライアント生成ID(楽観的UI)
クライアントサイドで楽観的に生成されたエンティティ(たとえばチャットの一時的メッセージ)の識別子に最適です。
tsconst tempMessageId = nanoid(); // サーバー送信前の一意識別子
URLに埋め込む識別子
たとえば、NotionのようなアプリでURLにIDを含める場合に、nanoidの短くてURLセーフな文字列は非常に便利です。
arduinohttps://example.com/document/fpX9hA_cz9wJ1NxyL8C5f
短縮URLサービス
URL短縮系のサービスでは、短さが命。必要な衝突回避レベルに応じてnanoid(7)のように長さ調整ができます。
tsconst shortUrlId = nanoid(7)
データベースの一意キー(衝突回避)
RDBMSやNoSQLで、UUIDよりも短く扱いやすいIDを主キーに利用するケースがあります。
サイズ効率や可読性の向上を図れます。
tsconst userId = nanoid(); // ユーザーID
ファイル名のランダム生成
一意なファイル名を作成し、重複を避ける用途にも適しています。
tsconst fileName = `${nanoid(10)}.jpg`; // 例: Xy1wP9AzQs.jpg
テストデータのランダム生成
モックやスタブのID生成など、ユニットテストやE2Eテストのダミーデータ作成にも有用です。
tsfunction createMockUser() {
return {
id: nanoid(),
name: 'John Doe'
}
}
使い方
インストール
bash$ yarn add nanoid
またはnpmを使用する場合:
bash$ npm install nanoid
基本的なID生成
tsimport { nanoid } from 'nanoid'
const id = nanoid() // デフォルトで21文字
const shortId = nanoid(10) // 任意の長さに変更可能
カスタムアルファベットの使用
使用する文字セットを指定して、IDの構成要素を制御できます。
tsimport { customAlphabet } from 'nanoid'
const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
const customId = customAlphabet(alphabet, 8)() // 例: X9A2Bt7C
非セキュア版(超高速)
開発中などセキュリティを重視しない場合、nanoid/non-secureを使うことで大幅に高速化できます。
tsimport { nanoid } from 'nanoid/non-secure'
const fastId = nanoid(10) // ただしセキュリティ強度は低い
注意点と補足
| 項目 | 説明 |
|---|---|
| セキュリティ強度 | 本番では必ず nanoid を使用し、non-secure は避けるべきです。 |
| 衝突回避 | nanoid(21) でおおよそ10億件以上で1件の衝突確率とされます。 |
| 長さの目安 | 高い一意性が必要な場合は 21文字以上推奨。ID数が少なければ短くてもOK。 |
| サーバーレス環境でも有効 | 外部依存が少なく、純粋なJavaScriptで完結するため、Cloud FunctionsやEdge環境にも最適です。 |
まとめ
nanoidは短くて安全な一意の文字列IDを素早く生成できる便利なツールです。
- URLセーフで取り回しやすく、可読性も高い
- ID長や文字セットのカスタマイズが柔軟
- クライアントでもサーバーでも軽快に動作
- セキュリティ要件に応じて
non-secureとの使い分けが可能
UUIDの代替を探している場合や、軽量な識別子が欲しいケースでは、ぜひnanoidの導入を検討してみてください。
著書
トラブルシュートNode.jsセキュリティアップデート、今すぐ必要?環境別の判断フローチャート
トラブルシュート【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説
トラブルシュートTypeScriptでESMとCJS混在をトラブルシュートする ERR_REQUIRE_ESMとimport不可を直す
チートシートNode.js 25.x, 24.x, 22.x, 20.x の脆弱性対応:2025 年 12 月版で修正された 3 件の High Severity 問題の詳細
使い方Node.js BFF 設計の最適解:Route Handlers/GraphQL/tRPC の責務分割
チートシートNode.js ファイルパス地図:`fs`/`path`/`URL`/`import.meta.url` の迷わない対応表
トラブルシュートaxios 脆弱性対応ガイド 2026:影響確認・バージョンアップ・代替手段の判断まで
使い方JavaScript 非同期エラー完全攻略:Unhandled Rejection を根絶する設計パターン
チートシート【早見表】JavaScript MutationObserver & ResizeObserver 徹底活用:DOM 変化を正しく監視する
使い方JavaScript Drag & Drop API 完全攻略:ファイルアップロード UI を最速で作る
検証・比較JavaScript structuredClone 徹底検証:JSON 方式や cloneDeep との速度・互換比較
トラブルシュートJavaScript 時刻の落とし穴大全:タイムゾーン/DST/うるう秒の実務対策
挙動Codex の履歴の確認と削除: 消したあとも、頼みごとの文は別のファイルに残っていた
使い方MCP サーバーを入れる前のセキュリティチェック: 何ができるサーバーかは、つなぐ前に見られる
使い方Codex CLI の使い方: 入れてから最初の作業まで。codex exec が止まって見える理由
使い方Orca の使い方: Claude Code のサブスクリプションのまま使える。最初に変える設定は権限
チートシートCodex の料金プラン一覧: Plus の5時間の枠は、GPT-6.1 Sol で応答160〜200回だった
挙動Codex の sandbox の設定: read-only でも .env は読める。モードごとにできること
