T-CREATOR

UUIDより短いユニークなIDを生成できるnpmライブラリnanoidの使い方

UUIDより短いユニークなIDを生成できるnpmライブラリnanoidの使い方
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

nanoidは、セキュアで短く、URLセーフな一意の文字列IDを簡単に生成できるnpmライブラリです。
UUIDに比べて文字数が少なく、扱いやすい形式であることから、多くのJavaScript/TypeScriptプロジェクトで重宝されています。

公式リポジトリ:ai/nanoid

UUIDとの違い

UUID(特にv4)は広く利用される識別子ですが、以下のような違いがあります。

特性UUID v4nanoid
長さ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

もっと見る