核心演算法流程
- 對原網址計算
crc32 校驗碼
sprintf('%u') 轉為無符號整數
- 對 62 取模 (0-9, A-Z, a-z 共 62 字符),餘數映射字符
- 商繼續除以 62,直到商為 0
- 反轉字符序列得到短碼
字符映射表
| 餘數範圍 | 映射字符 |
| 0-9 | 0-9 |
| 10-35 | A-Z |
| 36-61 | a-z |
實現代碼
<?php
function dwz($url) {
$code = floatval(sprintf('%u', crc32($url)));
$surl = '';
while ($code) {
$mod = fmod($code, 62);
if ($mod > 9 && $mod <= 35) {
$mod = chr($mod + 55); // A-Z
} elseif ($mod > 35) {
$mod = chr($mod + 61); // a-z
}
$surl .= $mod;
$code = floor($code / 62);
}
return $surl;
}
// 測試
echo dwz('https://blog.csdn.net/fdipzone'); // rs5U24
?>
注意事項
crc32 碰撞概率較高,生產環境建議用 md5 / sha256 + Base62 編碼
- 短碼長度不固定,可配合資料庫自增 ID 保證唯一性
- 大流量系統需考慮分佈式 ID 生成策略 (Snowflake 等)