PHP实现短链接转换算法:MD5哈希与位运算原理

闻溪
闻溪
发布时间:2026-10-15 | 3人浏览过
原创

如何利用PHP将长网址转换为简短的URL?本文详细解析了一种基于MD5哈希和位运算的经典短链算法,提供完整的函数代码、参数配置说明以及碰撞率测试结果,帮助开发者快速实现短链接服务。

算法核心逻辑

短链接生成的核心在于将不可控的长URL映射为固定长度的短字符串。该方案主要依赖以下四个步骤:

  1. MD5签名:将长网址(可选加上前缀和后缀)进行MD5加密,生成32位的十六进制签名串。
  2. 分段处理:将32位字符串分为4段,每段8个字节。
  3. 位运算与掩码:取出8字节,将其视为16进制数,并与 0x3FFFFFFF(二进制30个1)进行“与”操作。这一步是为了确保数值不超过30位,从而能够被进一步细分。
  4. 字符映射:将剩下的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);
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表