Encoding
エンコーディング(符号化 )は、データを特定 の形式 に変換 するプロセスで、データの転送 、保存 、表示 に使用 されます。
Base エンコーディング概要
| エンコード | 文字数 | 1文字あたりのbits | 典型的な文字構成 | エンコード長の推定式 | 備考 |
|---|---|---|---|---|---|
| Base16 | 16 | 4 bits | 0-9, A-F | エンコード長 = dataLen × 2 | 最も基本的なhex表示、バイナリ表示によく使用 |
| Base32 | 32 | 5 bits | A-Z, 2-7 | エンコード長 ≈ ceil((dataLen × 8) / 5) | RFC 4648規格、ファイル名やセキュリティコードに使用 |
| Base62 | 62 | 約 5.954 bits | 0-9, A-Z, a-z | エンコード長 ≈ ceil((dataLen × 8) / log2(62)) | 標準RFCなし、短縮URL、IDエンコードに使用 |
| Base64 | 64 | 6 bits | A-Z, a-z, 0-9, +, / | エンコード長 = ceil((dataLen × 8) / 6) | 最も広く使用されるバイナリ→文字列エンコード形式 |
Base-N エンコード / デコード公式
| プロセス | 公式 | 説明 | 変数説明 |
|---|---|---|---|
| Encode | digit = num % base | num mod base の余りを取得、余りがその桁の値 | num: 入力整数、base: 基数(例:62)digit: 現在の桁の値(文字テーブルのインデックス) |
num = num / base | num を base で割り、次の桁(上位)を処理準備 | num: 残りのエンコード対象整数 | |
| 文字対応 | digit を文字テーブルの対応する文字にマッピング | digit で文字テーブルから文字を取得 | |
| 結果の組み立て | 取得した文字を順に結果文字列に追加 | 余りは下位から生成されるため、最後に文字列を反転 | |
| Decode | num = num * base + val | 各桁の文字を数値に戻し、baseN の多桁数を復元 | num: 組み立て中の整数累積val: 文字テーブルでの文字のインデックス値 |
| 文字検索 | 文字テーブルでの文字の位置を val として取得 | 文字テーブルに基づいて値を決定 | |
| ループ累積 | 最上位から最下位へ順に値を累積 | エンコード文字列全体をループ |
基本進数
| 進数 | 英語名 | 基数 | 使用文字 | C/Go/Java 形式 | Python f-string | C# ToString |
|---|---|---|---|---|---|---|
| 2進数 | Binary | 2 | 0, 1 | %b (Go), 標準なし | {:b} | Convert.ToString(n,2) |
| 8進数 | Octal | 8 | 0-7 | %o | {:o} | Convert.ToString(n,8) |
| 10進数 | Decimal | 10 | 0-9 | %d | {:d} または {} | {:d} またはデフォルト |
| 16進数 | Hexadecimal | 16 | 0-9, A-F | %x (小文字), %X (大文字) | {:x} (小文字), {:X} (大文字) | {:x} (小文字), {:X} (大文字) |
数値プレフィックス表記
| 進数 | 一般的なプレフィックス | 例 | 説明 |
|---|---|---|---|
| 2進数 | 0b, 0B | 0b1010, 0B1010 | 10進数の10を表す |
| 8進数 | 0o, 0 (旧式) | 0o12, 012 | 10進数の10を表す |
| 10進数 | なし | 10 | デフォルト形式 |
| 16進数 | 0x, 0X | 0xA, 0XA | 10進数の10を表す |
特殊フォーマットオプション
| 機能 | C/Go/Java | Python | 説明 |
|---|---|---|---|
| ゼロ埋め | %08x | {:08x} | 指定幅までゼロ埋め |
| プレフィックス | 手動 | {:#x} | 自動で0xを追加 |
| 符号表示 | %+d | {:+d} | 正負の符号を表示 |
| 左揃え | %-8d | {:<8d} | 左揃えで埋める |
| スペース埋め | % d | {: d} | 数値の前にスペース |
実例(値255)
| 進数 | 出力結果 | プレフィックス付き | 8桁ゼロ埋め |
|---|---|---|---|
| 2進数 | 11111111 | 0b11111111 | 00011111111 |
| 8進数 | 377 | 0o377 | 00000377 |
| 10進数 | 255 | 255 | 00000255 |
| 16進数 | ff | 0xff | 000000ff |
覚え方
- d = Decimal(10進数 )
- o = Octal(8進数 )
- x = heXadecimal(16進数 )
- b = Binary(2進数 )
- 小文字 = 小文字 (a-f)を出力
- 大文字 = 大文字 (A-F)を出力
衝突閾値分析
誕生日 パラドックスによると、約 √N 個 のランダム値 を生成 すると、50%の確率 で衝突 が発生 します。
Base16(16進数)
| 桁数 | 可能な数 | 50%衝突閾値 | 使用シーン |
|---|---|---|---|
| 4桁 | 65,536 | 256 | UUID部分、小規模Hash |
| 6桁 | 16,777,216 | 4,096 | 中規模アプリ、カラーコード拡張 |
| 8桁 | 4,294,967,296 | 65,536 | CRC32、大規模アプリ |
Base32(RFC 4648標準)
| 桁数 | 可能な数 | 50%衝突閾値 | 使用シーン |
|---|---|---|---|
| 5桁 | 33,554,432 | 5,793 | 秘密鍵、Token、認証コード |
| 6桁 | 1,073,741,824 | 32,768 | 大規模システム、Session ID |
| 8桁 | 1,099,511,627,776 | 1,048,576 | 超大規模システム、分散ID |
Base62(短縮URLでよく使用)
| 桁数 | 可能な数 | 50%衝突閾値 | 使用シーン |
|---|---|---|---|
| 3桁 | 238,328 | 488 | 小規模アプリ、内部ツール |
| 4桁 | 14,776,336 | 3,844 | 中規模アプリ、部門システム |
| 5桁 | 916,132,832 | 30,268 | 大規模アプリ、紹介コード |
| 6桁 | 56,800,235,584 | 238,340 | エンタープライズ、短縮URLサービス |
| 7桁 | 3,521,614,606,208 | 1,877,509 | 超大規模、グローバルサービス |
| 8桁 | 218,340,105,584,896 | 14,760,556 | グローバル級、YouTube風 |
Base64(標準エンコード)
| 桁数 | 可能な数 | 50%衝突閾値 | 使用シーン |
|---|---|---|---|
| 4桁 | 16,777,216 | 4,096 | 中規模アプリ、API Key |
| 5桁 | 1,073,741,824 | 32,768 | 大規模アプリ、ファイルHash |
| 6桁 | 68,719,476,736 | 262,144 | エンタープライズ、データベースID |
| 8桁 | 281,474,976,710,656 | 16,777,216 | グローバル級、UUID代替 |
ユーザー規模別推奨
| 予想ユーザー数 | 推奨方式 | 安全マージン |
|---|---|---|
| < 1,000 | Base62-3桁、Base16-4桁 | 10x+ 安全 |
| 1,000 - 10,000 | Base62-4桁、Base32-5桁 | 5x+ 安全 |
| 10,000 - 100,000 | Base62-5桁、Base64-4桁 | 3x+ 安全 |
| 100,000 - 1,000,000 | Base62-6桁、Base64-5桁 | 2x+ 安全 |
| 1,000,000+ | Base62-7桁+、Base64-6桁+ | 十分安全 |
メモリ使用量対照表
すべてのcodesをキャッシュする場合 のメモリ使用量 推定 :
| Code数量 | メモリ使用量 | リスクレベル | 推奨戦略 |
|---|---|---|---|
| 10万 | ~10MB | 🟢 安全 | メモリキャッシュ |
| 100万 | ~100MB | 🟡 注意 | メモリ + 有効期限 |
| 1000万 | ~1GB | 🔴 危険 | Redisキャッシュ |
| 1億+ | ~10GB+ | ❌ 不可 | Bloom Filter |
SHA-256 エンコード長比較
SHA-256の32 bytes を各 エンコードした後 の長 さ比較 :
| 進数 | 1文字のbits | 長さ計算式 | SHA-256出力 | 一般的な用途 |
|---|---|---|---|---|
| Base8 | 3 bits | ceil(N * 8 / 3) | ≈ 86 文字 | まれ、UNIXファイル権限(0755など) |
| Base16 | 4 bits | N * 2 | 64 文字 | Hash表示(SHA256、MD5)、UUID |
| Base32 | 5 bits | ceil(N * 8 / 5) | 52 文字 | QRコード、一部のtoken(RFC 4648) |
| Base58 | ≈ 5.857 bits | ceil(N * 8 / log₂(58)) ≈ N * 1.37 | ≈ 44 文字 | Bitcoinアドレス、紛らわしい文字を除外 |
| Base62 | ≈ 5.954 bits | ≈ N * 1.34 | ≈ 43 文字 | 短縮URL、Slug、カスタムID |
| Base64 | 6 bits | ceil(N * 8 / 6) → =で4の倍数に | 44 文字 | Token、画像アップロード、HTTP転送 |
| Base64URL | 6 bits | 同上、ただし=パディングなし | 43 文字 | JWT、URL安全エンコード |
出力比較表
| エンコード | 出力文字列長 | 固定長かどうか | 特殊文字 |
|---|---|---|---|
| Base8 | ≈ 86 | バイト数による | 0~7のみ |
| Base16 | 64 | 固定 | 0-9, a-f |
| Base32 | 52 | 固定(パディングあり) | 大文字英数 + = |
| Base58 | ≈ 44 | 可変 | 0OIlなど紛らわしい文字を除外 |
| Base62 | ≈ 43 | 可変 | 数字 + 大小文字 |
| Base64 | 44 | 固定(=付き) | +, /, = |
| Base64URL | 43 | 固定(=なし) | -, _ |
簡易暗記法
| エンコード | 1文字あたりのbits | 元のバイト長との比較 |
|---|---|---|
| Base16 | 4 bits | 長さ = 2倍 bytes |
| Base64 | 6 bits | 長さ ≈ 1.33倍 bytes |
| Base58 | ~5.86 bits | 長さ ≈ 1.37倍 bytes |
| Base62 | ~5.95 bits | 長さ ≈ 1.34倍 bytes |