DevToolBox

UUIDを短くする方法 - Base64/Base62エンコードで22文字に

最終更新日: 2026-07-22公開日: 2026-07-22執筆: DevToolBox編集部

UUIDの桁数を減らし、URLやDBでUUIDを短く扱いたいなら、値を切り詰める必要はありません。 標準のUUID文字列は36文字ですが、実体は128bit(16バイト)です。Base64URLへ変換すれば情報量を保ったまま22文字にできます。 この記事では「uuid 桁数 減らす」「uuid 短くする」を安全に実現する方法とBase62を解説します。

A canonical UUID is 36 characters because it represents 128 bits as hexadecimal with four hyphens. Encoding the same 16 bytes with unpadded Base64URL reduces it to 22 characters without losing information. This guide also explains Base62 and practical trade-offs.

UUIDはなぜ36文字なのか

標準表現 550e8400-e29b-41d4-a716-446655440000 は16進数32桁とハイフン4個を合わせた36文字です。ただしUUIDの実体は128bit(16バイト)の数値にすぎず、文字列表現が冗長なだけです。

「uuid 文字数」や「uuid 桁数」を減らすには、128bitを保ったまま別の基数で表現します。ハイフンを除くだけなら32文字、Base64やBase62ならさらに短くできます。

Base64URLなら36文字を22文字にできる

16バイトをBase64エンコードすると24文字になり、末尾のパディング == を除けば22文字です。 UUIDは常に16バイトなので復元時に補え、情報は失われません。標準Base64の +/ はURLで問題になるため、-_ を使うBase64URL(URL-safe版)を選びます。

JavaScriptでUUIDをBase64URLへ変換する

UUIDからハイフンを除去して16進数として解釈し、16バイトの Uint8Arrayへ変換してからBase64URLエンコードします。

function uuidToBase64Url(uuid: string): string {
  const hex = uuid.replaceAll("-", "");
  if (!/^[0-9a-f]{32}$/i.test(hex)) throw new Error("Invalid UUID");
  const bytes = new Uint8Array(16);
  for (let i = 0; i < bytes.length; i++) {
    bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
  }
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary)
    .replaceAll("+", "-")
    .replaceAll("/", "_")
    .replace(/=+$/, "");
}
const uuid = crypto.randomUUID();
const shortId = uuidToBase64Url(uuid);
console.log(uuid);           // 例: 550e8400-e29b-41d4-a716-446655440000
console.log(shortId);        // 例: VQ6EAOKbQdSnFkRmVUQAAA
console.log(shortId.length); // 22

本サイトのBase64ツールで試す場合も、UUID文字列そのものではなく、 ハイフンを除いた16進数を16バイトのバイナリへ変換してから入力します。 UUIDはUUID Generatorで生成できます。

短い文字列から元のUUIDへ戻す

Base64URLは可逆です。パディングを戻して16バイトを取り出せば、元のUUID形式へ完全に戻せます。

function base64UrlToUuid(shortId: string): string {
  const base64 = shortId.replaceAll("-", "+").replaceAll("_", "/") + "==";
  const binary = atob(base64);
  if (binary.length !== 16) throw new Error("Invalid UUID bytes");
  const hex = Array.from(binary, (char) =>
    char.charCodeAt(0).toString(16).padStart(2, "0")
  ).join("");
  return [hex.slice(0, 8), hex.slice(8, 12), hex.slice(12, 16),
    hex.slice(16, 20), hex.slice(20)].join("-");
}

Base62という選択肢

Base62は 0-9a-zA-Z の62文字だけを使い、URLに特殊文字を一切含みません。 128bitは通常最大22文字で、先頭ゼロを固定長にしない実装では値によって21文字以下となり、さらに短くなる場合があります。

ただし128bit整数の除算や先頭ゼロの保持方法を定義する必要があり、標準機能のあるBase64より実装は少し複雑です。 単純な固定長変換ならBase64URL、特殊文字を完全に避けたいならBase62が適します。

短縮UUIDを使う際のトレードオフ

短縮文字列はUUID形式だと判別しにくく、人間には読みにくくなります。しかし可逆なので、デコードすれば元のUUIDへ戻せ、機能的な問題はありません。 URLやAPIでは便利ですが、ログの目視確認、障害調査、既存ツールとの連携では標準UUID形式の方が扱いやすい場合があります。

「uuid 短く」で見かける末尾の切り捨ては情報を失い、衝突確率を上げます。uuidを短くするなら128bitを保持する再エンコードを選びます。

表現方法ごとの文字数比較 / Length comparison

表現 / Representation文字数備考
標準UUID文字列(ハイフンあり)36文字最も可読性が高い。ログや画面表示向け
ハイフンなし16進数32文字桁数を減らす最も単純な方法。可逆で実装も簡単
Base64(標準、パディングあり)24文字末尾に==のパディングを含む
Base64URL(パディング省略)22文字URLで安全に使える。本記事で解説する方式
Base6221〜22文字値により変動。特殊文字を完全に避けたい場合向け
生バイナリ(16バイト)16バイトDB列の型として保存する場合の実体サイズ

データベースでの保存方法 / Database storage

アプリケーション層でBase64URLに短縮しても、DB側でCHAR(36)のまま保存すると、短縮の効果はストレージや インデックスサイズには及びません。本当に保存効率・インデックス性能を最適化したい場合は、DB列自体をBINARY(16)(MySQL)やuuid型・bytea(PostgreSQL)にして16バイトのまま保存し、 アプリケーション層では表示用にBase64URLへ変換するだけにするのが効果的です。CHAR(36)と比べて格納 バイト数が少なく、固定長のBINARY(16)の方がインデックスの比較コストも軽くなります。

「表示・URL用の短縮」と「DB内部の保存効率化」は別の問題です。前者だけが目的ならアプリ層の変換のみで十分ですが、 大量データでインデックスサイズが問題になっている場合はDBスキーマ側の変更を検討してください。

不正な短縮IDをデコードする際のエラー処理 / Validating before decoding

外部から受け取った短縮IDをそのままbase64UrlToUuidに渡すと、長さや文字種が不正な入力で例外が発生します。 URLパラメータなど信頼できない入力を扱う場合は、デコード前に文字種と長さを検証してください。

function isValidShortId(value: string): boolean {
  // Base64URLは英数字と -_ のみ、22文字(パディングなし16バイト相当)
  return /^[A-Za-z0-9_-]{22}$/.test(value);
}

function safeBase64UrlToUuid(shortId: string): string | null {
  if (!isValidShortId(shortId)) return null;
  try {
    return base64UrlToUuid(shortId);
  } catch {
    return null;
  }
}

PythonでBase64URLへ変換する / Python implementation

import uuid
import base64

def uuid_to_base64url(u: uuid.UUID) -> str:
    return base64.urlsafe_b64encode(u.bytes).rstrip(b"=").decode("ascii")

def base64url_to_uuid(short_id: str) -> uuid.UUID:
    padded = short_id + "=" * (-len(short_id) % 4)
    return uuid.UUID(bytes=base64.urlsafe_b64decode(padded))

u = uuid.uuid4()
short_id = uuid_to_base64url(u)
print(u, short_id, len(short_id))  # 22

まとめ

36文字のUUIDは128bitを16進数とハイフンで表したものです。16バイトをBase64URLへ変換し == を省けば22文字になります。 URLならBase64URL、特殊文字を避けるならBase62を選び、人が読むログでは標準UUIDを残すと運用しやすくなります。

English summary

A UUID contains 128 bits; its 36-character form is only hexadecimal plus hyphens. Encoding its 16 bytes as Base64URL without == padding produces a reversible 22-character ID. Base62 uses only letters and digits but is more complex. Keep canonical UUIDs where human readability and tooling compatibility matter.

関連ツール・ガイド / Related tools & guides