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
の導入を検討してみてください。
記事Article
もっと見る- article
React Suspenseを使う際に避けたいアンチパターン5選と解決策について紹介
- article
React SuspenseとServer Componentsの融合:クライアントとサーバの役割分担
- article
Suspense + useTransitionで滑らかなUXを実現するやり方を紹介
- article
React Suspenseでデータフェッチ!fetchでは動かない理由と正しい書き方について紹介
- article
React 18のSuspense完全対応ガイド:並列レンダリング時代の新常識
- article
Suspense × lazyで始めるコード分割:Reactアプリの初歩的最適化