Encoding
編碼(Encoding)是將資料轉換為特定格式的過程,用於資料傳輸、儲存或顯示。
Base 編碼概覽
| 編碼類型 | 字元數 | 每字元代表 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,常用於短網址、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: 進位基底,例如 62digit: 當前位的數值(索引字母表) |
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 |
|---|---|---|---|---|---|---|
| 二進位 | Binary | 2 | 0, 1 | %b (Go), 無標準 | {:b} | Convert.ToString(n,2) |
| 八進位 | Octal | 8 | 0-7 | %o | {:o} | Convert.ToString(n,8) |
| 十進位 | Decimal | 10 | 0-9 | %d | {:d} 或 {} | {:d} 或預設 |
| 十六進位 | Hexadecimal | 16 | 0-9, A-F | %x (小寫), %X (大寫) | {:x} (小寫), {:X} (大寫) | {:x} (小寫), {:X} (大寫) |
數值前綴表示法
| 進位制 | 常見前綴 | 範例 | 說明 |
|---|---|---|---|
| 二進位 | 0b, 0B | 0b1010, 0B1010 | 代表十進位的 10 |
| 八進位 | 0o, 0 (舊式) | 0o12, 012 | 代表十進位的 10 |
| 十進位 | 無 | 10 | 預設格式 |
| 十六進位 | 0x, 0X | 0xA, 0XA | 代表十進位的 10 |
特殊格式化選項
| 功能 | C/Go/Java | Python | 說明 |
|---|---|---|---|
| 補零 | %08x | {:08x} | 補零到指定寬度 |
| 加前綴 | 手動 | {:#x} | 自動加 0x 前綴 |
| 正負號 | %+d | {:+d} | 顯示正負號 |
| 左對齊 | %-8d | {:<8d} | 左對齊填充 |
| 空格填充 | % d | {: d} | 數前加空格 |
實際範例(數值 255)
| 進位制 | 輸出結果 | 帶前綴 | 補零 8 位 |
|---|---|---|---|
| 二進位 | 11111111 | 0b11111111 | 00011111111 |
| 八進位 | 377 | 0o377 | 00000377 |
| 十進位 | 255 | 255 | 00000255 |
| 十六進位 | ff | 0xff | 000000ff |
記憶技巧
- d = Decimal(十進位)
- o = Octal(八進位)
- x = heXadecimal(十六進位)
- b = Binary(二進位)
- 小寫 = 輸出小寫字母(a-f)
- 大寫 = 輸出大寫字母(A-F)
碰撞閾值分析
根據生日悖論,當產生約 √N 個隨機值時,有 50% 機率發生碰撞。
Base16(十六進制)
| 位數 | 可能數量 | 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(短網址常用)
| 位數 | 可能數量 | 50% 碰撞閾值 | 應用場景 |
|---|---|---|---|
| 3 位 | 238,328 | 488 | 小型應用、內部工具 |
| 4 位 | 14,776,336 | 3,844 | 中型應用、部門系統 |
| 5 位 | 916,132,832 | 30,268 | 大型應用、推薦碼 |
| 6 位 | 56,800,235,584 | 238,340 | 企業級、短網址服務 |
| 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 經各編碼後長度比較:
| 進位制 | 每字元幾 bits | 長度計算公式 | SHA-256 輸出 | 常見用途 |
|---|---|---|---|---|
| Base8 | 3 bits | ceil(N * 8 / 3) | ≈ 86 chars | 少用,UNIX 檔案權限(如 0755) |
| Base16 | 4 bits | N * 2 | 64 chars | Hash 顯示(SHA256、MD5)、UUID |
| Base32 | 5 bits | ceil(N * 8 / 5) | 52 chars | QR Code、某些 token(RFC 4648) |
| Base58 | ≈ 5.857 bits | ceil(N * 8 / log₂(58)) ≈ N * 1.37 | ≈ 44 chars | Bitcoin 地址、減少易混字 |
| Base62 | ≈ 5.954 bits | ≈ N * 1.34 | ≈ 43 chars | 短網址、Slug、自定義 ID |
| Base64 | 6 bits | ceil(N * 8 / 6) → 補 = 到 4 的倍數 | 44 chars | Token、圖片上傳、HTTP 傳輸 |
| Base64URL | 6 bits | 同上,但去掉 = padding | 43 chars | JWT、URL 安全編碼 |
輸出比較表
| 編碼方式 | 輸出字串長度 | 是否固定長度 | 特殊字元 |
|---|---|---|---|
| Base8 | ≈ 86 | 取決於 byte 數 | 僅 0~7 |
| Base16 | 64 | 固定 | 0-9, a-f |
| Base32 | 52 | 固定(補字元) | 大寫英數 + = |
| Base58 | ≈ 44 | 變動 | 避免 0OIl 等混字 |
| Base62 | ≈ 43 | 變動 | 數字 + 大小寫字母 |
| Base64 | 44 | 固定(補 =) | +, /, = |
| Base64URL | 43 | 固定(無 =) | -, _ |
快速記憶法
| 編碼 | 每字元代表 bits | 長度 vs 原始 byte 長度 |
|---|---|---|
| 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 |