PHP实现短链接转换算法:MD5哈希与位运算原理
如何利用PHP将长网址转换为简短的URL?本文详细解析了一种基于MD5哈希和位运算的经典短链算法,提供完整的函数代码、参数配置说明以及碰撞率测试结果,帮助开发者快速实现短链接服务。
算法核心逻辑
短链接生成的核心在于将不可控的长URL映射为固定长度的短字符串。该方案主要依赖以下四个步骤:
- MD5签名:将长网址(可选加上前缀和后缀)进行MD5加密,生成32位的十六进制签名串。
- 分段处理:将32位字符串分为4段,每段8个字节。
- 位运算与掩码:取出8字节,将其视为16进制数,并与
0x3FFFFFFF(二进制30个1)进行“与”操作。这一步是为了确保数值不超过30位,从而能够被进一步细分。 - 字符映射:将剩下的30位再次细分为6组,每组5位(即最大值为31)。这组数值作为字符集的索引,提取对应的字符,最终组成一个6位的短码。
由于一个MD5值能生成4个不同的6位短串,开发者可以任选其一作为最终的短链接标识。
基础版本实现
此版本使用包含小写字母和数字的基础字符集,生成纯小写短码。适用于对格式要求不严格,追求唯一性的场景。
function shorturl($url='', $prefix='', $suffix='') {
// 定义字符集:26个小写字母 + 10个数字 = 36进制
$base = array (
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '0', '1', '2', '3', '4', '5'
);
// 1. 生成MD5哈希值
$hex = md5($prefix . $url . $suffix);
$hexLen = strlen($hex);
// 2. 分为4段进行处理
$subHexLen = $hexLen / 8;
$output = array();
for ($i = 0; $i < $subHexLen; $i++) {
// 截取8个字节
$subHex = substr($hex, $i * 8, 8);
// 3. 转为整数并与0x3FFFFFFF进行按位与,保留低30位
$int = 0x3FFFFFFF & (1 * ('0x' . $subHex));
$out = '';
// 4. 将30位分为6组,每组5位,映射到字符集
for ($j = 0; $j < 6; $j++) {
$val = 0x0000001F & $int; // 0x1F即31,5个1
$out .= $base[$val];
$int = $int >> 5; // 右移5位
}
$output[] = $out;
}
return $output;
}
// 测试示例
$urls = shorturl('https://www.example.com/');
var_dump($urls);本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













