短网址常见核心算法

一、长网址计算 hash

用于标识是否已经入库该长网址,如 md5 这个重复几率理论上是 2^128 个后才会发生

二、生成短码(短网址)

这里的短码生成方法有很多 ,简单列举几个

  • 通过自增 ID(推荐)

短码用来进行唯一标识,一般使用数据库自增 ID 来作为唯一标识。
当然直接暴漏 ID 是不明智的,可以对 ID 进行加密,如进制转换。
常见的是对数字 ID 转换为(自定义)62进制(10位数字+52位大小写字母)

推荐使用hashids库,支持所有流行语言 https://hashids.org/

  • 通过 md5 变形转换

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

引自网络 https://blog.mimvp.com/article/25420.html
  • 通过时间戳+随机数转62进制

其实建议是“随机数+时间戳“这样生成的生成数字随机性比较大,然后转62位,随机数推荐4位数,这样可以基本保证生成的62进制控制在8个字符以内。
感觉这个是时间和空间比较平衡的一种算法,缺点是当机器为分布式的时候重复几率随着机器数量呈几何式增大。

  • 通过数据库遍历

这种方法是最靠谱但是网址多了之后也是最低效的,即:先生成一个随机固定的短码,然后去数据库查是否存在,不存在则插入,存在就重新生成,直到不存在再插入。

Author: thinkwei

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注