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

PHP 短網址產生原理與實作:Base62 編碼演算法完整解析

     編輯:PHP 綜合知識

短網址服務(如 bit.ly、t.cn)的核心在於將冗長的原始 URL 轉換為極短的代碼。最經典的做法是利用 CRC32 雜湊 取得一個無符號整數,再以 Base62(0-9、A-Z、a-z)編碼 將其轉為短字串。本文詳細拆解演算法步驟,並提供可直接使用的 PHP 函式。

核心原理四步驟

  1. CRC32 校驗:對原網址字串計算 CRC32,得到 32 位元有號整數。
  2. 轉無符號數:用 sprintf('%u') 將其轉為無符號整數(範圍 0 ~ 4,294,967,295)。
  3. Base62 取餘映射:對 62 取餘,餘數對應字元表(0-9 → 0-9,10-35 → A-Z,36-61 → a-z),將字元推入結果。
  4. 迴圈直到商為 0:將商繼續除以 62,重複取餘映射,最後將字元串接即得短代碼。

完整 PHP 實作

<?php
/**
 * 產生短網址代碼
 * @param string $url 原始長網址
 * @return string 短代碼(Base62 編碼)
 */
function dwz($url) {
    // 1. CRC32 + 無符號轉換
    $code = sprintf('%u', crc32($url));

    $surl = '';
    // 2. Base62 編碼迴圈
    while ($code) {
        $mod = $code % 62;
        if ($mod > 9 && $mod <= 35) {
            $mod = chr($mod + 55);      // 10-35 → 'A'-'Z'
        } elseif ($mod > 35) {
            $mod = chr($mod + 61);      // 36-61 → 'a'-'z'
        }
        // 0-9 直接保留數字字元
        $surl .= $mod;
        $code = floor($code / 62);
    }
    return $surl;
}

// 使用範例
echo dwz('https://www.example.com/very/long/url/with/parameters?id=12345'); // 輸出類似 "aB3dE"
?>

補充說明

  • 碰撞處理:CRC32 只有 32 位,極大量資料下會有碰撞機率。生產環境建議搭配資料庫檢查或改用更長的雜湊(如 MD5 取前 64 位再 Base62)。
  • 自訂字元表:若需避免易混淆字元(如 0/O、1/l),可自行調整映射表。
  • 效能:純整數運算,極快,適合高併發場景。

這個演算法簡潔高效,是打造自有短網址服務的絕佳起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved