短链接的算法

什么是短链接?

短链接,其实就把我们平时看到的网络地址,转换成比较简短的网址。
案例:我们可以把https://www.baidu.com/ 简化为短链接:https://qnr.io/j6Dcss。
短链接的优势:简短、美观、便于传播,比如说给一些用户push短信的时候,短链接就很有优势,短信一条70个字,短信内容超过70个字的时候就按两条计费了,这时候利用短链接,可以压缩短信内容,顺便也能短信费用了。

原理解析

当我们在浏览器里输入 https://qnr.io/j6Dcss在这里插入图片描述

  1. DNS解析qnr.io域名,发送GET请求 /j6Dcss
  2. 服务器会通过短码获取对应的原URL
  3. 然后通过 HTTP 302 转到对应的原URL

HTTP 301与 302的区别

301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。
但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而点收集击次数的意义那就不言而喻了,关键是现在服务器硬件设备都很好,还有支持高并发的NGINX,所以对服务器的压力几乎可以忽略,最终也就选择302。

算法实现

网上比较流行的算法有两种 自增序列算法、 摘要算法

自增序列算法

短址的长度一般设为 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 总共 62 个字母组成的,所以 6 位的话,总共会有 62^6 ~= 568亿种组合,一般肯定是够用了。
将原网址分配一个从1位到6位的随机短码,存数据库记录,对返回的id进行62进制转码。

摘要算法

  1. 将原网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节
  2. 对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理 这 30 位分成 6 段, 每 5位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串
  3. 总的 md5 串可以获得 4 个 6位串,取里面的任意一个就可作为这个长 url 的短 url 地址 这种算法,虽然会生成4个,但是仍然存在重复几率

两种算法优势

第一种算法的好处就是简单好理解,永不重复。但是短码的长度不固定,随着 id 变大从一位长度开始递增。如果非要让短码长度固定也可以就是让 id 从指定的数字开始递增就可以了。

第二种算法,虽然几率很小,但是存在碰撞(重复)的可能性。短码位数是比较固定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个高效、安全的链接算法需要考虑以下几个方面: 1. 算法的哈希函数:选择合适的哈希函数可以保证算法的性能和安全性。常用的哈希函数有 MD5、SHA1 等,也可以选择更加安全的哈希函数,如 SHA256、SHA512 等。 2. 链接的长度:链接长度越生成链接越容易重复,长度越长则链接越难记忆。一般建议链接长度在 6-8 位之间。 3. 链接的字符集:选择合适的字符集可以减少生成重复链接的可能性,常用的字符集有数字、大小写字母、特殊字符等,也可以自定义字符集。 4. 处理重复和冲突问题:可以通过在生成链接时对原始链接进行哈希、加盐等方式,增加链接的随机性,减少生成重复链接的可能性。同时可以将链接存储到数据库中,并设置唯一索引,防止链接发生冲突。 下面是一个简单的 PHP 实现示例: ```php function generate_short_link($url) { $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $short_url = ''; $hash = md5($url . 'salt'); // 对原始链接进行哈希加盐处理 for ($i = 0; $i < 6; $i++) { // 生成 6 位链接 $short_url .= $charset[mt_rand(0, strlen($charset) - 1)]; } // 判断链接是否已存在,如果存在则重新生成 $query = "SELECT COUNT(*) FROM short_links WHERE short_url = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$short_url]); $count = $stmt->fetchColumn(); if ($count > 0) { return generate_short_link($url); } // 将链接存储到数据库中 $query = "INSERT INTO short_links (short_url, original_url) VALUES (?, ?)"; $stmt = $pdo->prepare($query); $stmt->execute([$short_url, $url]); return $short_url; } ``` 以上代码仅作为示例,实际应用中需要根据具体需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值