当前位置: 面试刷题>> 短网址 (经典算法题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哈希。