首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

短鏈接生成算法 PHP 實現:基於 MD5 與 Base32 編碼的 Short URL 完整代碼

     編輯:關於C語言

算法原理

  1. 對長 URL 計算 MD5 雜湊 (128bit, 32十六進制字符)。
  2. 將 32 字符分為 4 段,每段 8 字符 (32bit)。
  3. 每段轉為無符號整數,掩碼 0x3FFFFFFF 取低 30 位。
  4. 循環 6 次,每次取低 5 位 (& 0x1F) 作為索引,查 Base32 字符表,右移 5 位。
  5. 得到 4 個 6 字符的候選短碼,可按需選用,衝突時備用。

PHP 完整實現


> 5;                    // 右移 5 位
        }
        $output[] = $out;
    }
    return $output; // 返回 4 個候選碼
}

// 測試
$urls = [
    'https://www.snippetit.com/1',
    'https://www.snippetit.com/2'
];

foreach ($urls as $url) {
    $codes = shorturl($url);
    echo "Input : $url\n";
    foreach ($codes as $idx => $code) {
        echo ($idx === 0 ? "Output : " : "         ") . "$code\n";
    }
    echo "\n";
}
?>

運行輸出示例

Input : https://www.snippetit.com/1
Output : h0xg4r
         bdr3tw
         osk2d3
         4azfqa

Input : https://www.snippetit.com/2
Output : tm5kxb
         ceoj2s
         yw3dvl
         nrmrxl

碰撞概率與應對

  • 碼空間:32^6 = 1,073,741,824 (約 10 億)。
  • 碰撞機率 ≈ n / 10^9 (n 為已存記錄數)。百萬級數據碰撞率 ~0.1%。
  • 策略:資料庫唯一索引檢測衝突 → 依次嘗試備用碼 → 仍衝突則重新生成 (如加鹽重新 MD5)。

增強安全性/不可預測性

  1. 打亂字符表:自定義 $base32 順序。
  2. 加入私鑰:md5('secret_prefix' . $input . 'secret_suffix')。
  3. XOR 擾動:$val ^ 18 等固定值異或。

適用場景

  • 短鏈接服務、邀請碼、分享碼、臨時文件下載鏈接。
  • 純算法無狀態,易於分布式部署,無需協調 ID 分配器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved