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
の導入を検討してみてください。
- blog
うちのチーム、これやってない?アジャイル開発を腐らせる、ありがちなアンチパターン 10 選と処方箋
- blog
CD パイプラインを構築して、開発チームを「リリース疲れ」から解放しよう
- blog
見積もりが全然当たらないあなたへ。プランニングポーカーで楽しく、納得感のある見積もりをするコツ
- blog
「QA は最後の砦」という幻想を捨てる。開発プロセスに QA を組み込み、手戻りをなくす方法
- blog
ドキュメントは「悪」じゃない。アジャイル開発で「ちょうどいい」ドキュメントを見つけるための思考法
- blog
「アジャイルコーチ」って何する人?チームを最強にする影の立役者の役割と、あなたがコーチになるための道筋
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来
- review
人類はなぜ地球を支配できた?『サピエンス全史 上巻』ユヴァル・ノア・ハラリが解き明かす驚愕の真実
- review
え?世界はこんなに良くなってた!『FACTFULNESS』ハンス・ロスリングが暴く 10 の思い込みの正体
- review
瞬時に答えが出る脳に変身!『ゼロ秒思考』赤羽雄二が贈る思考力爆上げトレーニング
- review
関西弁のゾウに人生変えられた!『夢をかなえるゾウ 1』水野敬也が教えてくれた成功の本質
- review
「なぜ私の考えは浅いのか?」の答えがここに『「具体 ⇄ 抽象」トレーニング』細谷功