Encoding

編碼(Encoding)是將資料轉換為特定格式的過程,用於資料傳輸、儲存或顯示。

Base 編碼概覽

編碼類型字元數每字元代表 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,常用於短網址、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 / basenum 除以 base,準備處理下一位(高位)num: 剩餘待編碼的整數
字母對應digit 對應到字母表中相應的字元digit 索引字母表取得字元
組合結果將每次得到的字元依序加入結果字串因為餘數從低位開始產生,最後要反轉字串
Decodenum = num * base + val逐位將字串字元轉回數字,模擬多位數的 baseN 還原num: 組合中的整數累積
val: 字元在字母表中的索引值
字元查表找出字元在字母表的位置作為 val根據字母表決定數值
迴圈累積從最高位往最低位依序累積數值循環整個編碼字串

基本進位制

進位制英文名稱基數使用字符C/Go/Java 格式Python f-stringC# ToString
二進位Binary20, 1%b (Go), 無標準{:b}Convert.ToString(n,2)
八進位Octal80-7%o{:o}Convert.ToString(n,8)
十進位Decimal100-9%d{:d}{}{:d} 或預設
十六進位Hexadecimal160-9, A-F%x (小寫), %X (大寫){:x} (小寫), {:X} (大寫){:x} (小寫), {:X} (大寫)

數值前綴表示法

進位制常見前綴範例說明
二進位0b, 0B0b1010, 0B1010代表十進位的 10
八進位0o, 0 (舊式)0o12, 012代表十進位的 10
十進位10預設格式
十六進位0x, 0X0xA, 0XA代表十進位的 10

特殊格式化選項

功能C/Go/JavaPython說明
補零%08x{:08x}補零到指定寬度
加前綴手動{:#x}自動加 0x 前綴
正負號%+d{:+d}顯示正負號
左對齊%-8d{:<8d}左對齊填充
空格填充% d{: d}數前加空格

實際範例(數值 255)

進位制輸出結果帶前綴補零 8 位
二進位111111110b1111111100011111111
八進位3770o37700000377
十進位25525500000255
十六進位ff0xff000000ff

記憶技巧

  • d = Decimal(十進位)
  • o = Octal(八進位)
  • x = heXadecimal(十六進位)
  • b = Binary(二進位)
  • 小寫 = 輸出小寫字母(a-f)
  • 大寫 = 輸出大寫字母(A-F)

碰撞閾值分析

根據生日悖論,當產生約 √N 個隨機值時,有 50% 機率發生碰撞。

Base16(十六進制)

位數可能數量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(短網址常用)

位數可能數量50% 碰撞閾值應用場景
3 位238,328488小型應用、內部工具
4 位14,776,3363,844中型應用、部門系統
5 位916,132,83230,268大型應用、推薦碼
6 位56,800,235,584238,340企業級、短網址服務
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 經各編碼後長度比較:

進位制每字元幾 bits長度計算公式SHA-256 輸出常見用途
Base83 bitsceil(N * 8 / 3)≈ 86 chars少用,UNIX 檔案權限(如 0755
Base164 bitsN * 264 charsHash 顯示(SHA256、MD5)、UUID
Base325 bitsceil(N * 8 / 5)52 charsQR Code、某些 token(RFC 4648)
Base58≈ 5.857 bitsceil(N * 8 / log₂(58)) ≈ N * 1.37≈ 44 charsBitcoin 地址、減少易混字
Base62≈ 5.954 bits≈ N * 1.34≈ 43 chars短網址、Slug、自定義 ID
Base646 bitsceil(N * 8 / 6) → 補 = 到 4 的倍數44 charsToken、圖片上傳、HTTP 傳輸
Base64URL6 bits同上,但去掉 = padding43 charsJWT、URL 安全編碼

輸出比較表

編碼方式輸出字串長度是否固定長度特殊字元
Base8≈ 86取決於 byte 數僅 0~7
Base1664固定0-9, a-f
Base3252固定(補字元)大寫英數 + =
Base58≈ 44變動避免 0OIl 等混字
Base62≈ 43變動數字 + 大小寫字母
Base6444固定(補 =+, /, =
Base64URL43固定(無 =-, _

快速記憶法

編碼每字元代表 bits長度 vs 原始 byte 長度
Base164 bits長度 = 2 倍 bytes
Base646 bits長度 ≈ 1.33 倍 bytes
Base58~5.86 bits長度 ≈ 1.37 倍 bytes
Base62~5.95 bits長度 ≈ 1.34 倍 bytes