一、长网址计算 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
引自网络 https://blog.mimvp.com/article/25420.html
2) 对这四段循环处理,取8个字节,将他看成16进制串与0x3fffffff(30位1)与操作,即前缀超过30位的字符串做忽略处理,直接舍弃掉了;
3) 这30位分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;
4) 总的 md5 串可以获得4个6位串,取4组里面的任意一个就可作为这个长url的短url地址;
这种算法,虽然会生成4个,但是仍然存在重复几率
- 通过时间戳+随机数转62进制
其实建议是“随机数+时间戳“这样生成的生成数字随机性比较大,然后转62位,随机数推荐4位数,这样可以基本保证生成的62进制控制在8个字符以内。
感觉这个是时间和空间比较平衡的一种算法,缺点是当机器为分布式的时候重复几率随着机器数量呈几何式增大。
- 通过数据库遍历
这种方法是最靠谱但是网址多了之后也是最低效的,即:先生成一个随机固定的短码,然后去数据库查是否存在,不存在则插入,存在就重新生成,直到不存在再插入。