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


题目补充: 设计一个短网址服务系统,该系统可以将长网址转换为短网址,并且能够通过短网址重定向回原始的长网址。要求实现这一功能的基本算法,并给出PHP、Python、JavaScript的示例代码片段,用于生成短网址。 ### 解题思路 短网址的生成通常涉及以下几个步骤: 1. **哈希或编码**:将长网址通过哈希算法(如MD5、SHA-256)或某种编码方式转换为一段固定长度的字符串。 2. **缩短和去重**:由于哈希值通常较长,需要对其进行缩短处理,并添加一定的去重机制(如数据库检查、时间戳等)以避免冲突。 3. **存储映射**:将短网址和长网址的映射关系存储在数据库中,以便后续的重定向操作。 ### 示例代码 #### PHP 示例 ```php ``` #### Python 示例 ```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 示例 ```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哈希。
推荐面试题