🎲 NanoID ジェネレーター
URLセーフで短い一意ID「NanoID」を生成します。既定はアルファベット A-Za-z0-9_-(64文字)・長さ21。乱数は暗号的乱数(crypto.getRandomValues)で、モジュロバイアスを避けるマスク&リジェクション方式で一様に生成します。アルファベットとID長は自由に変更できます。生成はすべてブラウザ内で行い、どこにも送信されません。
生成設定
生成結果
「NanoIDを生成」を押すとここに表示されます。
衝突しにくさの目安
総組み合わせ数は「アルファベット文字数 ^ ID長」です。目安はいわゆる誕生日問題の近似で、あくまで概算です。用途に応じてID長を調整してください。
NanoID と UUID / ULID の違い
解説
NanoID(ナノアイディー)は、短くてURLセーフな一意ID(識別子)を作るための仕組みです。既定のアルファベットは A〜Z・a〜z・0〜9 とアンダースコア「_」・ハイフン「-」の64文字で、長さは21文字。この21文字のIDは、UUIDv4(36文字)とほぼ同等以上の衝突しにくさを保ちながら、より短く、URLやファイル名にそのまま埋め込める点が特長です。本ツールは、そのNanoIDをブラウザ内だけで生成します。データベースの主キー、共有リンクのトークン、ファイル名の接尾辞など、「短くて一意なID」が欲しい場面に向いています。
UUIDとの一番の違いは「短さ」と「URLセーフさ」です。UUIDは 8-4-4-4-12 のハイフン区切りで36文字あり、URLに置くと長くハイフンも混ざります。NanoIDは既定でハイフンやスラッシュのような特殊記号を含まず(区切り文字も「_」「-」のみ)、そのままアドレスに載せてもエスケープが要りません。さらに、アルファベットと長さを自由に決められるのもNanoID固有の柔軟さです。時系列にソートしたいなら時刻を内包するULIDが、標準仕様に厳密に合わせたいならUUIDが向くなど、用途で使い分けます(本ツールの「NanoID と UUID / ULID の違い」表も参考にしてください)。
アルファベットと長さは、そのIDが取り得る組み合わせの数を直接決めます。組み合わせの総数は「アルファベットの文字数 ^ 長さ」で、たとえば64文字・長さ21なら 64^21 ≒ 4×10^37 通りです。文字数を減らす(数字のみ=10文字など)と、同じ衝突しにくさを保つには長さを増やす必要があります。逆に、人が読み上げる用途では 0/O や 1/l/I のように見間違えやすい文字を除いた集合(本ツールの「誤読回避」プリセット)を選ぶと、口頭やメモでの取り違えを減らせます。本ツールでは、選んだ設定に応じて総組み合わせ数と、いわゆる誕生日問題の近似による「衝突しやすさの目安」を表示します。
IDの品質は乱数の質で決まります。本ツールは暗号的に安全な乱数 crypto.getRandomValues を使い、さらに「マスク&リジェクションサンプリング」でモジュロバイアス(剰余の偏り)を避けています。具体的には、アルファベットの長さを覆う最小の 2のべき乗マイナス1 のビットマスクで乱数を下位ビットに丸め、値がアルファベットの範囲内に収まったものだけを採用し、範囲外は捨てて引き直します。これにより各文字が等確率で選ばれ、単純な「乱数 % 文字数」で生じる偏りが出ません。これはNanoID本家の実装と同じ考え方です。生成はすべて端末内(ブラウザ内)で行われ、生成したIDや設定はどこにも送信されません。
よくある質問
NanoIDとは何ですか?
短くてURLセーフな一意ID(識別子)を作る仕組みです。既定ではアルファベット A-Za-z0-9_- の64文字から21文字を選んで作ります。UUIDより短く、URLやファイル名にそのまま使いやすいのが特長です。
UUIDとどう違うのですか?
UUIDv4は36文字・ハイフン区切りの固定仕様ですが、NanoIDは既定21文字と短く、区切り文字も「_」「-」のみでURLにそのまま載せられます。さらにアルファベットと長さを自由に決められる柔軟さがあります。時系列ソートが欲しい場合は時刻を内包するULIDが向きます。
既定が「長さ21」なのはなぜですか?
64文字のアルファベットで長さ21にすると、組み合わせの総数が 64^21 ≒ 4×10^37 通りになり、UUIDv4(乱数122bit)と同等以上に衝突しにくくなるためです。短さと衝突しにくさのバランスとして本家NanoIDが採用している既定値です。
モジュロバイアスとは何ですか?どう対策していますか?
「乱数を文字数で割った余り」で文字を選ぶと、割り切れない分だけ特定の文字が出やすくなる偏りのことです。本ツールは本家NanoIDと同じマスク&リジェクション方式で、ビットマスクで丸めた値が範囲内のときだけ採用し範囲外は引き直すため、各文字が等確率になり偏りが出ません。
アルファベットや長さを変えても安全ですか?
はい。文字数と長さに応じてマスクと取得バイト数を計算し直すので、どの設定でも一様に生成されます。ただし文字数を減らしたり長さを短くすると総組み合わせ数が減り衝突しやすくなります。目安欄の数値を見て、用途に合う長さを選んでください。
「衝突しにくさの目安」の数値はどう読めばよいですか?
総組み合わせ数は「文字数^長さ」です。あわせて、いわゆる誕生日問題の近似で「何個くらい生成すると衝突確率が1%/50%に達するか」の目安も表示します。いずれも概算なので、厳密な設計が必要な場合は余裕を持った長さにしてください。
生成したIDは重複しないと保証されますか?
確率的に「極めて起きにくい」だけで、数学的にゼロにはなりません。実運用では、データベース側の一意制約(ユニークインデックス)と併用し、万一の重複時は再生成する設計が安全です。長さを十分に取るほど重複の確率は下がります。
入力や生成したIDはサーバーに送られますか?
送られません。乱数生成・組み立て・コピー・.txt保存まですべてブラウザ内で完結し、設定やIDはどこにも送信されません。オフラインでも利用できます。