Encoding

エンコーディング(符号化(ふごうか) )は、データを特定(とくてい)形式(けいしき)変換(へんかん) するプロセスで、データの転送(てんそう)保存(ほぞん)表示(ひょうじ)使用(しよう) されます。

Base エンコーディング概要

エンコード文字数1文字あたりのbits典型的な文字構成エンコード長の推定式備考
Base16164 bits0-9, A-Fエンコード長 = dataLen × 2最も基本的なhex表示、バイナリ表示によく使用
Base32325 bitsA-Z, 2-7エンコード長 ≈ ceil((dataLen × 8) / 5)RFC 4648規格、ファイル名やセキュリティコードに使用
Base6262約 5.954 bits0-9, A-Z, a-zエンコード長 ≈ ceil((dataLen × 8) / log2(62))標準RFCなし、短縮URL、IDエンコードに使用
Base64646 bitsA-Z, a-z, 0-9, +, /エンコード長 = ceil((dataLen × 8) / 6)最も広く使用されるバイナリ→文字列エンコード形式

Base-N エンコード / デコード公式

プロセス公式説明変数説明
Encodedigit = num % basenum mod base の余りを取得、余りがその桁の値num: 入力整数、base: 基数(例:62)
digit: 現在の桁の値(文字テーブルのインデックス)
num = num / basenumbase で割り、次の桁(上位)を処理準備num: 残りのエンコード対象整数
文字対応digit を文字テーブルの対応する文字にマッピングdigit で文字テーブルから文字を取得
結果の組み立て取得した文字を順に結果文字列に追加余りは下位から生成されるため、最後に文字列を反転
Decodenum = num * base + val各桁の文字を数値に戻し、baseN の多桁数を復元num: 組み立て中の整数累積
val: 文字テーブルでの文字のインデックス値
文字検索文字テーブルでの文字の位置を val として取得文字テーブルに基づいて値を決定
ループ累積最上位から最下位へ順に値を累積エンコード文字列全体をループ

基本進数

進数英語名基数使用文字C/Go/Java 形式Python f-stringC# ToString
2進数Binary20, 1%b (Go), 標準なし{:b}Convert.ToString(n,2)
8進数Octal80-7%o{:o}Convert.ToString(n,8)
10進数Decimal100-9%d{:d} または {}{:d} またはデフォルト
16進数Hexadecimal160-9, A-F%x (小文字), %X (大文字){:x} (小文字), {:X} (大文字){:x} (小文字), {:X} (大文字)

数値プレフィックス表記

進数一般的なプレフィックス説明
2進数0b, 0B0b1010, 0B101010進数の10を表す
8進数0o, 0 (旧式)0o12, 01210進数の10を表す
10進数なし10デフォルト形式
16進数0x, 0X0xA, 0XA10進数の10を表す

特殊フォーマットオプション

機能C/Go/JavaPython説明
ゼロ埋め%08x{:08x}指定幅までゼロ埋め
プレフィックス手動{:#x}自動で0xを追加
符号表示%+d{:+d}正負の符号を表示
左揃え%-8d{:<8d}左揃えで埋める
スペース埋め% d{: d}数値の前にスペース

実例(値255)

進数出力結果プレフィックス付き8桁ゼロ埋め
2進数111111110b1111111100011111111
8進数3770o37700000377
10進数25525500000255
16進数ff0xff000000ff

覚え方

  • d = Decimal(10進数(しんすう)
  • o = Octal(8進数(しんすう)
  • x = heXadecimal(16進数(しんすう)
  • b = Binary(2進数(しんすう)
  • 小文字(こもじ) = 小文字(こもじ) (a-f)を出力(しゅつりょく)
  • 大文字(おおもじ) = 大文字(おおもじ) (A-F)を出力(しゅつりょく)

衝突閾値分析

誕生日(たんじょうび) パラドックスによると、(やく) √N () のランダム()生成(せいせい) すると、50%の確率(かくりつ)衝突(しょうとつ)発生(はっせい) します。

Base16(16進数)

桁数可能な数50%衝突閾値使用シーン
4桁65,536256UUID部分、小規模Hash
6桁16,777,2164,096中規模アプリ、カラーコード拡張
8桁4,294,967,29665,536CRC32、大規模アプリ

Base32(RFC 4648標準)

桁数可能な数50%衝突閾値使用シーン
5桁33,554,4325,793秘密鍵、Token、認証コード
6桁1,073,741,82432,768大規模システム、Session ID
8桁1,099,511,627,7761,048,576超大規模システム、分散ID

Base62(短縮URLでよく使用)

桁数可能な数50%衝突閾値使用シーン
3桁238,328488小規模アプリ、内部ツール
4桁14,776,3363,844中規模アプリ、部門システム
5桁916,132,83230,268大規模アプリ、紹介コード
6桁56,800,235,584238,340エンタープライズ、短縮URLサービス
7桁3,521,614,606,2081,877,509超大規模、グローバルサービス
8桁218,340,105,584,89614,760,556グローバル級、YouTube風

Base64(標準エンコード)

桁数可能な数50%衝突閾値使用シーン
4桁16,777,2164,096中規模アプリ、API Key
5桁1,073,741,82432,768大規模アプリ、ファイルHash
6桁68,719,476,736262,144エンタープライズ、データベースID
8桁281,474,976,710,65616,777,216グローバル級、UUID代替

ユーザー規模別推奨

予想ユーザー数推奨方式安全マージン
< 1,000Base62-3桁、Base16-4桁10x+ 安全
1,000 - 10,000Base62-4桁、Base32-5桁5x+ 安全
10,000 - 100,000Base62-5桁、Base64-4桁3x+ 安全
100,000 - 1,000,000Base62-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出力一般的な用途
Base83 bitsceil(N * 8 / 3)≈ 86 文字まれ、UNIXファイル権限(0755など)
Base164 bitsN * 264 文字Hash表示(SHA256、MD5)、UUID
Base325 bitsceil(N * 8 / 5)52 文字QRコード、一部のtoken(RFC 4648)
Base58≈ 5.857 bitsceil(N * 8 / log₂(58)) ≈ N * 1.37≈ 44 文字Bitcoinアドレス、紛らわしい文字を除外
Base62≈ 5.954 bits≈ N * 1.34≈ 43 文字短縮URL、Slug、カスタムID
Base646 bitsceil(N * 8 / 6)=で4の倍数に44 文字Token、画像アップロード、HTTP転送
Base64URL6 bits同上、ただし=パディングなし43 文字JWT、URL安全エンコード

出力比較表

エンコード出力文字列長固定長かどうか特殊文字
Base8≈ 86バイト数による0~7のみ
Base1664固定0-9, a-f
Base3252固定(パディングあり)大文字英数 + =
Base58≈ 44可変0OIlなど紛らわしい文字を除外
Base62≈ 43可変数字 + 大小文字
Base6444固定(=付き)+, /, =
Base64URL43固定(=なし)-, _

簡易暗記法

エンコード1文字あたりのbits元のバイト長との比較
Base164 bits長さ = 2倍 bytes
Base646 bits長さ ≈ 1.33倍 bytes
Base58~5.86 bits長さ ≈ 1.37倍 bytes
Base62~5.95 bits長さ ≈ 1.34倍 bytes