当前位置: 面试刷题>> 短网址 (经典算法题500道)


题目补充: 设计一个短网址服务系统,该系统可以将长网址转换为短网址,并且能够通过短网址重定向回原始的长网址。要求实现这一功能的基本算法,并给出PHP、Python、JavaScript的示例代码片段,用于生成短网址。

解题思路

短网址的生成通常涉及以下几个步骤:

  1. 哈希或编码:将长网址通过哈希算法(如MD5、SHA-256)或某种编码方式转换为一段固定长度的字符串。
  2. 缩短和去重:由于哈希值通常较长,需要对其进行缩短处理,并添加一定的去重机制(如数据库检查、时间戳等)以避免冲突。
  3. 存储映射:将短网址和长网址的映射关系存储在数据库中,以便后续的重定向操作。

示例代码

PHP 示例

<?php
function generateShortUrl($longUrl) {
    // 假设有一个存储映射的数据库或缓存系统
    // 这里简化为使用MD5哈希并截取部分字符串
    $hash = md5($longUrl . time()); // 添加时间戳以减少冲突
    $shortUrl = substr($hash, 0, 8); // 截取前8位作为短网址

    // 实际上应该检查数据库中是否已存在该短网址,若存在则重新生成
    // 这里仅展示生成逻辑

    return "http://short.url/" . $shortUrl;
}

// 使用示例
$longUrl = "https://www.example.com/very/long/url/with/many/parameters";
$shortUrl = generateShortUrl($longUrl);
echo $shortUrl; // 输出类似:http://short.url/1a2b3c4d

// 注意:实际应用中,你可能需要将$shortUrl存储到数据库,并处理可能的冲突。
?>

Python 示例

import hashlib
import time

def generate_short_url(long_url):
    timestamp = str(int(time.time()))
    hashed_url = hashlib.sha256((long_url + timestamp).encode('utf-8')).hexdigest()
    short_url = hashed_url[:8]  # 取前8位

    # 实际应用中应检查数据库中是否已存在该短网址

    return f"http://short.url/{short_url}"

# 使用示例
long_url = "https://www.example.com/very/long/url/with/many/parameters"
short_url = generate_short_url(long_url)
print(short_url)  # 输出类似:http://short.url/xxxxxxxx

# 注意:实际应用中,你可能需要添加额外的逻辑来处理可能的哈希冲突。

JavaScript 示例

function generateShortUrl(longUrl) {
    const timestamp = Date.now().toString();
    const hash = CryptoJS.SHA256(longUrl + timestamp).toString(CryptoJS.enc.Hex);
    const shortUrl = hash.substring(0, 8); // 取前8位

    // 注意:这里假设你有一个方法来存储和检查短网址的唯一性
    // 实际应用中,你需要与后端服务交互来完成这些工作

    return `http://short.url/${shortUrl}`;
}

// 注意:这里使用了CryptoJS库进行SHA256哈希,实际使用时需要先安装或引入该库

// 使用示例
const longUrl = "https://www.example.com/very/long/url/with/many/parameters";
const shortUrl = generateShortUrl(longUrl);
console.log(shortUrl); // 输出类似:http://short.url/xxxxxxxx

注意

  • 上述示例中,为了简化,直接通过哈希值截取来生成短网址,这在实际应用中可能会导致冲突。
  • 实际应用中,你需要在数据库中检查生成的短网址是否已存在,若存在,则重新生成,直到找到未使用的短网址为止。
  • 示例中使用了不同的哈希算法(MD5、SHA-256),你可以根据需要选择合适的算法。
  • 示例中的timestamp用于减少哈希冲突的可能性,但并不能完全避免。
  • JavaScript示例中使用了CryptoJS库,实际使用时需要引入该库或选择其他方式进行SHA256哈希。
推荐面试题