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の導入を検討してみてください。
articleNode.js で GraphQL サーバー構築:Yoga/Apollo を最小構成で立ち上げる
articleDeno vs Node.js vs Bun ベンチマーク:起動時間・HTTP スループット・DX 比較
articleBun vs Node.js 徹底比較:起動時間・スループット・メモリの実測レポート
articleNode.js BFF 設計の最適解:Route Handlers/GraphQL/tRPC の責務分割
articleNode.js ファイルパス地図:`fs`/`path`/`URL`/`import.meta.url` の迷わない対応表
articleNode.js プロジェクト初期化テンプレ:ESM 前提の `package.json` 設計と `exports` ルール
articleJavaScript 非同期エラー完全攻略:Unhandled Rejection を根絶する設計パターン
article【早見表】JavaScript MutationObserver & ResizeObserver 徹底活用:DOM 変化を正しく監視する
articleJavaScript Drag & Drop API 完全攻略:ファイルアップロード UI を最速で作る
articleJavaScript structuredClone 徹底検証:JSON 方式や cloneDeep との速度・互換比較
articleJavaScript 時刻の落とし穴大全:タイムゾーン/DST/うるう秒の実務対策
articleJavaScript Web Animations API:滑らかに動く UI を設計するための基本と実践
articleNotebookLM の強みと弱み:従来ノートアプリとの本質的な違い
articleMySQL キャパシティプランニング:Buffer Pool/IOPS/接続数の見積もり術
articleMotion(旧 Framer Motion)A/B テスト運用:アニメの効果測定とフェイルセーフ切替戦略
articleNode.js で GraphQL サーバー構築:Yoga/Apollo を最小構成で立ち上げる
articleMistral が JSON 破綻する時の対処:出力拘束・再試行・検証リカバリ
articleNext.js の キャッシュ無効化設計:タグ・パス・スケジュールの 3 軸でコントロール
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来